簡體   English   中英

C ++靜態模板成員初始化問題

[英]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-listC++11功能,因此在C++03您只能使用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM