C++:在main.cpp中声明一个结构,但在头中有一个带类的模板的任何可能性

C++ : Any possibility to declare a struct in main.cpp but having a template with class in header

本文关键字:有一个 可能性 任何 一个 声明 cpp main C++ 结构      更新时间:2023-10-16

作为一个使用模板的C++初学者,我有一个问题,如果这很荒谬,我很抱歉。

在头文件中有这样一个模板:

template <class T> class MyClass

有可能在main.cpp中定义这样的结构吗:

struct CC;
struct CC
{
     MyClass (CC) p;
     CC() : p(0){}
}; 

或者:

struct Foo {
    MyClass<struct Foo> bar;
    MyClass<std::string> text;
};

我对此感到很失落。很抱歉

首先,模板是否在头文件中并不重要。编译器本身只看到预处理后的代码,此时没有文件。只是发短信。

让我们考虑第一个例子的变体:

template< class T >
class MyClass
{
    int x;
};
struct CC
{
     MyClass<CC> m;
     CC() {}
}; 
auto main() -> int {}

这编译得很好,因为MyClass模板实际上并没有将CC用于任何事情,因此除了它是一种类型之外,不需要任何其他知识。

但假设使用了它的大小。这需要完整类型。或者换句话说,一个完整的类型一个大小已知的类型。

template< class T >
class MyClass
{
    char x[sizeof( T )];
};
struct CC
{
     MyClass<CC> m;
     CC() {}
}; 
auto main() -> int {}

这不应编译,因为在使用MyClass<CC>时,CC的大小尚不清楚。可以稍后在类定义中定义额外的数据成员,例如虚拟函数。这将增加规模。


作为一个几乎相反的例子,考虑第三种变体:

template< class T >
class MyClass
{
public:
    void foo()
    {
        char x[sizeof( T )];
    }
};
struct CC
{
     MyClass<CC> m;
     void use_foo() { m.foo(); }
     CC() {}
}; 
auto main() -> int {}

这编译得很好,但为什么?显然,这里的模板也需要一个完整的CC类型?

但是不,编译器对待类中的成员函数定义,就好像它们被声明为inline并在类外定义一样,如下所示:

template< class T >
class MyClass
{
public:
    inline void foo();
};
template< class T >
void MyClass<T>::foo()
{
    char x[sizeof( T )];
}
struct CC
{
     MyClass<CC> m;
     inline void use_foo();
     CC() {}
}; 
void CC::use_foo() { m.foo(); }
auto main() -> int {}

从中可以看出,MyClass模板本身并不依赖于对CC大小的了解。

相关文章: