模板类静态数据实例化?

时间:2011-02-28 03:59:23

标签: c++

任何人都可以告诉我这段代码究竟发生了什么?

#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被实例化了。

非常感谢帮助。

2 个答案:

答案 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,因此永远不会创建它。