[英]C++ : Any possibility to declare a struct in main.cpp but having a template with class in header
作为使用模板的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
大小的知识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.