स्टेटिक प्रारंभ में अच्छी तरह से, इस विषय में वर्णित है here और यहां तक कि इस साइट hereस्टेटिक प्रारंभ
और हर जगह यह लिखा है पर है कि समस्या है, तो वहां मौजूद संबंधित स्थैतिक चर के साथ अलग अलग संकलन इकाइयों होता होगा। और यदि एक संकलन इकाई में स्थैतिक चर मौजूद हैं, तो समस्या नहीं होनी चाहिए: उन्हें फ़ाइल में उनकी स्थिति के क्रम में प्रारंभ किया जाएगा।
लेकिन मैं इस कोड है:
template <typename T>
class A{
public:
int _data;
T _obj;
A(int data) :_data(data){}
};
template <typename T>
class B{
public:
const static B<T> nullObj;
B(int data) :_a(new A<T>(data)){}
A<T> *_a;
};
template <typename T>
class C{
public:
const static C<T> nullObj;
C() :_a(nullObj._a){}
C(bool t) :_a(B<T>::nullObj._a){
_a->_data++; //FAILS HERE!
}
A<T> *_a;
};
template <typename T>
const B<T> B<T>::nullObj(0);
template <typename T>
const C<T> C<T>::nullObj(false);
class _B{};
class _A{ public: _A(){}; C<_B> g; };
int main(){
return 0;
}
और यह मुख्य() फंक्शन प्रवेश करने से पहले कार्यावधि में विफल रहता है, क्योंकि यह पहलेconst B<T> B<T>::nullObj(0);
आरंभ नहीं हो जाता const C<T> C<T>::nullObj(false);
प्रारंभ करने की कोशिश करता है। एक फ़ाइल में अपनी स्थिति के बावजूद।
यह पहले स्थैतिक चर से पहले दूसरे स्थैतिक चर को प्रारंभ करने का प्रयास क्यों करता है? क्या सी ++ स्टैंडअर्ट में अध्याय मौजूद है जहां स्थिर प्रारंभिक क्रम के अनुक्रम के साथ वास्तविक स्थिति का वर्णन किया गया है?
"क्यों यह पहली स्थिर चर से पहले दूसरी स्थिर चर को प्रारंभ करने की कोशिश करता है?" यहां कोई "पहला" और कोई "दूसरा" चर नहीं है, यह टेम्पलेट्स की एक जोड़ी है जिससे आप शून्य, दो, चार, छः, आठ आदि का उत्पादन कर सकते हैं। टेम्पलेट इंस्टेंटेशन पर स्थिर चर। – dasblinkenlight
@dasblinkenlight, ठीक है, आप सही हैं, तो सवाल यह है: "यह पहले स्थिर से पहले दूसरे स्थिर टेम्पलेट को प्रारंभ करने का प्रयास क्यों करता है?" – Arkady