के स्थिर सदस्यों को आरंभ करना मैं यह पता लगाने की कोशिश कर रहा हूं कि यह उदाहरण संकलित क्यों नहीं होता है। मेरी समझ यह है कि यदि एक स्थैतिक चर स्पष्ट रूप से सेट नहीं किया गया है तो यह 0 पर डिफ़ॉल्ट हो जाता है। उनमें से चार उदाहरण नीचे दिए गए पांच उदाहरणों में व्यवहार करते हैं, लेकिन जिस पर टिप्पणी की गई है वह संकलित नहीं होगी।एक टेम्पलेटेड क्लास
#include <iostream>
class Foo
{
public:
static int i;
static int j;
};
template <int n>
class Bar
{
public:
Bar(int) { }
static int i;
};
static int i;
int Foo::i;
int Foo::j = 1;
template <> int Bar<2>::i;
template <> int Bar<3>::i = 3;
int main(int argc, char** argv)
{
std::cout << "i " << i << std::endl;
std::cout << "Foo::i " << Foo::i << std::endl;
std::cout << "Foo::j " << Foo::j << std::endl;
//std::cout << "Bar<2>::i " << Bar<2>::i << std::endl; // Doesn't compile?
std::cout << "Bar<3>::i " << Bar<3>::i << std::endl;
return 0;
}
क्यों int Bar<2>::i
int Foo::i
या static int i
के रूप में एक ही बात नहीं करता है?
संपादित करें: मैं बार <> बार < 2> और बार < 3> घोषणाओं में टेम्पलेट जोड़ने के लिए भूल गया था। स्टैंडर्ड सी के नवीनतम मसौदे के अनुसार (समस्या का समाधान नहीं करता है, हालांकि, अभी भी लिंकर त्रुटियों हो रही)
[विशेष टेम्पलेट वर्ग के लिए स्थिर सदस्य प्रारंभिकरण] का डुप्लिकेट (http://stackoverflow.com/questions/2342550/static-member-initialization-for- विशेषीकृत- टेम्पलेट- क्लास)। –
लिंकिंग त्रुटि क्या है? – Chubsdad
@Chubsdad: निस्संदेह यह है कि "बार <2> :: i'" या इसका अर्थ कुछ है। ओपी के कोड में, 'टेम्पलेट <> int बार <2> :: i; '_nondefining_ घोषणा है (litb के विस्तृत स्पष्टीकरण के लिए लिंक किए गए डुप्लिकेट देखें)। –