C++:在main.cpp中声明一个结构,但在头中有一个带类的模板的任何可能性
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
大小的了解。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 有一个构造函数,但有两个析构函数
- C++:在main.cpp中声明一个结构,但在头中有一个带类的模板的任何可能性