我有一段简单的C++代码,其中我定义了一个模板和一个全局对象,通过对模板进行特化来定义该对象。对象构造函数访问特定模板中的静态成员变量,但事实证明,在这一点上静态成员未被初始化。但对于一个局部对象(在函数体内定义),它可以正常工作。我感到很困惑...
我的C++编译器是:g++(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609
/////////////////////////
template<typename T>
class TB{
public:
const char *_name;
TB(const char * str):_name(str){
cout << "constructor is called:" << _name << endl;
};
virtual ~TB(){
cout << "destructor is called:" << _name << endl;
};
};
template<typename T>
class TA{
public:
const char *_name;
TA(const char * str):_name(str){
cout << "constructor is called:" << _name << endl;
cout << tb._name <<endl;
};
virtual ~TA(){
cout << "destructor is called:" << _name << endl;
};
static TB<T> tb;
};
template<typename T>
TB<T> TA<T>::tb("static-tb");
TA<int> ta("global-ta");
int main(int argc,char ** argv){
cout << "program started." << endl;
cout << "program stopped." << endl;
return 0;
}
/////////////////////////
// OUTPUT:
constructor is called:global-ta
// yes, only such a single line.
如果我将ta的定义放在main()函数中,像下面这样,它就可以工作。
int main(int argc,char ** argv){
cout << "program started." << endl;
TA<int> ta("local-ta");
cout << "program stopped." << endl;
return 0;
}
/////////////////////
// OUTPUT:
constructor is called:static-tb
program started.
constructor is called:local-ta
static-tb
program stopped.
destructor is called:local-ta
destructor is called:static-tb
// end of output
cout
改为printf
,查看输出。TB<T> TA<T>::tb("static-tb");
没有被实例化,请参考 https://dev59.com/ClnUa4cB1Zd3GeqPfvo-?rq=1。 - Liu Hao