2012-09-12 25 views
10

जीसीसी 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; 
} 

इस मामले में हम stdout में किसी भी उत्पादन नहीं होगा। अगर हम इस तरह initializations बदल देंगे संकलक नाव और वर्ग ए के दोहरे विशेषज्ञता

लेकिन .. प्रारंभ करने में कोड उत्पन्न नहीं होगा:

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

संकलक इस तरह के कोड उत्पन्न होगा और हम होगा आउटपुट में डबल "बी()"।

क्या कोई इस तरह के व्यवहार को समझने में मेरी सहायता कर सकता है?

उत्तर

8

n3337 14.7.3/13

एक टेम्पलेट की एक स्थिर डेटा सदस्य का एक स्पष्ट विशेषज्ञता एक परिभाषा है, तो घोषणा एक प्रारंभकर्ता भी शामिल है; अन्यथा, यह एक घोषणा है। [ध्यान दें: एक टेम्पलेट की एक स्थिर डेटा सदस्य की परिभाषा है कि डिफ़ॉल्ट प्रारंभ आवश्यकता है एक braced-init-सूची का उपयोग करना चाहिए:

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

तो यदि आप डिफ़ॉल्ट कन्स्ट्रक्टर (सी ++ 11 के बिना) द्वारा 'x' प्रारंभ करना है) तो आप क्या करते हैं? – VF1