任何人都可以告诉我这段代码究竟发生了什么?
#include <iostream>
class BBB {
public:
BBB() { std::cout << std::endl << "BBB()" << std::endl; }
~BBB() { std::cout << std::endl << "~BBB()" << std::endl; }
};
template<class T>
class AAA {
public:
AAA(){}
~AAA(){}
void foo() {}
private:
static BBB b;
};
template<class T>
BBB AAA<T>::b;
//class CCC {
//
//private:
//
// static BBB bb;
//
//};
//
//BBB CCC::bb;
AAA<int> a;
int main()
{
//AAA<int> a;
a.foo();
return 0;
}
似乎&#34; b&#34;的构造函数当包含类是模板时,不调用AAA中的对象。尝试取消注释CCC类定义和&#34; bb&#34;将调用对象构造函数。这很奇怪,因为模板类A被实例化了。
非常感谢帮助。
答案 0 :(得分:4)
在大多数情况下,只有在使用该特定成员时,才会实例化类模板的每个成员。由于您的代码从不使用成员AAA<int>::b
,因此该成员未实例化。
将无操作语句b;
添加到AAA<T>::AAA()
或AAA<T>::~AAA()
或AAA<T>::foo()
会导致AAA<int>::b
静态对象按预期构造和销毁。
或者,如果您想告诉编译器继续并实例化某个类模板特化的所有成员,请使用显式实例化(在源文件中,而不是标题):
template class AAA<int>;
答案 1 :(得分:1)
模板与其他类的不同之处在于,只有实例化的内容才被实例化。由于你从未实际使用过A中的BBB,因此永远不会创建它。