2017-01-28 12 views
6

को देखते हुएनिर्वासन टेम्पलेट 'असंगत स्पष्ट instantiations'

#include <vector> 

// Case I: error 

त्रुटि C2961: 'std :: वेक्टर>': असंगत स्पष्ट instantiations, पिछले एक स्पष्ट इन्स्टेन्शियशन 'निर्वासन टेम्पलेट'

निर्दिष्ट नहीं था
template class std::vector<int>; 
extern template class std::vector<int>; 


// Case II: fine 
//extern template class std::vector<int>; 
//template class std::vector<int>; 

// Case III: fine 
//extern template class std::vector<int>; 
//template class std::vector<int>; 
//template class std::vector<int>; 

// Case IV: fine 
//extern template class std::vector<int>; 
//extern template class std::vector<int>; 
//template class std::vector<int>; 
//template class std::vector<int>; 


int main() 
{ 

} 

मैं वीएस2015 संस्करण 4.6 के साथ कोड बनाता हूं और C2961 त्रुटि देखता हूं। हालांकि, मुझे कंपाइलर http://gcc.godbolt.org/ के साथ त्रुटि दिखाई नहीं दे रही है।

क्या यह वीएस2015 के साथ एक बग है?

+1

'std :: vector' कम से कम दो टेम्पलेट तर्क लेता है, एक नहीं। (वास्तविक संख्या कार्यान्वयन-परिभाषित है।) – ildjarn

+3

@ildjarn डिफ़ॉल्ट रूप से क्यों नहीं लाएगा? –

+0

@ildjarn 'वेक्टर' का दूसरा तर्क पूरी तरह से वैकल्पिक है। http://www.cplusplus.com/reference/vector/vector/ –

उत्तर

6

एमएसवीसी और क्लैंग इस मामले में एक त्रुटि जारी करने का अधिकार हैं। [Temp.explicit]/11 मानक में कहते हैं: एक इकाई दोनों एक स्पष्ट इन्स्टेन्शियशन घोषणा और एक ही अनुवाद इकाई में एक स्पष्ट इन्स्टेन्शियशन परिभाषा का विषय है

हैं, तो परिभाषा घोषणा का पालन करेगा। [...]

template class std::vector<int>; एक स्पष्ट तत्काल परिभाषा है। extern वाला एक स्पष्ट तत्काल घोषणा है।

[...] एक कार्यक्रम स्पष्ट रूप से एक टेम्पलेट का दृष्टांत सकता है के रूप में परिभाषित:


ध्यान दें कि स्पष्ट रूप से std::vector<int> instantiating [namespace.std]/2 के अनुसार किसी भी मामले में बीमार का गठन है मानक लाइब्रेरी केवल तभी जब घोषणा उपयोगकर्ता-परिभाषित प्रकार के नाम पर निर्भर करती है और तत्कालता मूल टेम्पलेट के लिए मानक लाइब्रेरी आवश्यकताओं को पूरा करती है।

भी ध्यान रखें कि मामलों तृतीय और चतुर्थ भी [temp.spec]/5 के अनुसार बीमार का गठन कर रहे हैं:

किसी दिए गए टेम्पलेट और टेम्पलेट तर्क का एक सेट के लिए,

  • एक स्पष्ट इन्स्टेन्शियशन परिभाषा एक कार्यक्रम में अधिकतम एक बार दिखना होगा,

[ ...]

इस नियम के उल्लंघन का निदान करने के लिए एक कार्यान्वयन की आवश्यकता नहीं है।

संबंधित मुद्दे