[英]c++ static template members initialization issue
gcc 4.5.1,SuSE Linux i686
假設我們有下面的代碼:
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;
}
在這種情況下,標准輸出中沒有任何輸出。 編譯器不會生成用於初始化A類的float和double特殊化的代碼。
但是..如果我們改變這樣的初始化:
template<> B<float> A<float>::static_var = B<float>();
template<> B<double> A<double>::static_var = B<double>();
編譯器將生成這樣的代碼,並且輸出中將有兩個“ B()”。
有人可以幫助我了解這種行為嗎?
n3337 14.7.3 / 13
如果聲明包含初始化程序,則模板的靜態數據成員的顯式特化是定義。 否則,它是一個聲明。 [注意:需要默認初始化的模板的靜態數據成員的定義必須使用braced-init-list:
template<> X Q<int>::x; // declaration template<> X Q<int>::x (); // error: declares a function template<> X Q<int>::x { };// definition
—尾注]
braced-init-list
是C++11
功能,因此在C++03
您只能使用
template<> X Q<int>::x = ...;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.