2012-09-12 72 views
10

GCC 4.5.1,在SuSE Linux的i686C++静态模板成员初始化问题

假设我们有下面的代码:

template<typename realT> class B 
{ 
public: 
    B() {std::cout << "B()" << std::endl;} 
}; 

template<typename realT> class A 
{ 
public: 
    static B<realT> static_var; 
}; 

template<typename realT> B<realT> A<realT>::static_var; 
template<> B<float> A<float>::static_var; 
template<> B<double> A<double>::static_var; 

int main() 
{ 
    A<float> test; 
    return 0; 
} 

在这种情况下,我们不会在标准输出的任何输出。编译器不会生成代码来初始化float和A级的双专业化

但是..如果我们将改变这样的初始化:

template<> B<float> A<float>::static_var = B<float>(); 
template<> B<double> A<double>::static_var = B<double>(); 

编译器将生成这样的代码,我们将有在输出中双“B()”。

有人能帮助我理解这种行为吗?

回答

8

n3337 14.7.3/13

模板的静态数据成员的显式专业化是如果声明包含 初始化的定义;否则,这是一个声明。 [注:即 需要默认初始化一个模板的静态数据成员的定义必须使用一个支撑,初始化列表:

template<> X Q<int>::x; // declaration 
template<> X Q<int>::x(); // error: declares a function 
template<> X Q<int>::x { };// definition 

- 注完]

braced-init-listC++11功能,所以在C++03只能使用

template<> X Q<int>::x = ...; 
+0

感谢您的回答! – Ribtoks

+0

那么如果'x'被默认的构造函数初始化(没有C++ 11),你该怎么做? – VF1