2012-10-04 13 views
10

कोड

यहाँ मेरी समस्या का SSCCE उदाहरण है:खाका टेम्पलेट वर्ग MSVC++ संकलक पर विफल रहता है: C3201

// My Library, which I want to take in the user's enum and a template class which they put per-enum specialized code 
template <typename TEnum, template <TEnum> class EnumStruct> 
struct LibraryT { /* Library stuff */ }; 

// User Defined Enum and Associated Template (which gets specialized later) 
namespace MyEnum { 
    enum Enum { 
     Value1 /*, ... */ 
    }; 
}; 

template <MyEnum::Enum> 
struct MyEnumTemplate {}; 

template <> 
struct MyEnumTemplate<MyEnum::Value1> { /* specialized code here */ }; 

// Then the user wants to use the library: 
typedef LibraryT<MyEnum::Enum, MyEnumTemplate> MyLibrary; 

int main() { 
    MyLibrary library; 
} 

[संपादित: LibraryT<typename MyEnum::Enum, MyEnumTemplate> करने के लिए LibraryT<MyEnum::Enum, MyEnumTemplate> बदलने कोई प्रभाव नहीं है]

त्रुटि

कार्यक्षमता मैं इच्छा एक enum और एक वर्ग के आधार पर एक पुस्तकालय बनाने की क्षमता है जो उस enum द्वारा विशिष्ट है। ऊपर मेरा पहला प्रयास है। मेरा मानना ​​है कि यह 100% सी ++ है, और जीसीसी ने मुझे पीछे छोड़ दिया और कहा कि यह सब काम करता है। हालांकि, मैं यह MSVC++ संकलक के साथ संकलित करने के लिए चाहते हैं और यह मना कर दिया:

error C3201: the template parameter list for class template 'MyEnumTemplate' 
    does not match the template parameter list for template parameter 'EnumStruct' 

प्रश्न

वहाँ किसी तरह मैं MSVC++ संकलक कर सकते है [संपादित: MSVC++ 11 संकलक (वी.एस. 2012)] मेरे कोड की तरह? या तो कुछ अतिरिक्त विनिर्देशों या विभिन्न दृष्टिकोण से?

संभावित (लेकिन अवांछनीय) समाधान

हार्ड कोड enum प्रकार कुछ अभिन्न प्रकार (अंतर्निहित प्रकार) किया जाना है। फिर कोई समस्या नहीं है। लेकिन फिर मेरी लाइब्रेरी enum प्रकार के बजाय अभिन्न पर काम कर रहा है (अवांछनीय है, लेकिन काम कर)

// My Library, which I want to take in the user's enum and a template class which they put per-enum specialized code 
typedef unsigned long IntegralType; // **ADDED** 

template <template <IntegralType> class EnumStruct> // **CHANGED** 
struct LibraryT { /* Library stuff */ }; 

// User Defined Enum and Associated Template (which gets specialized later) 
namespace MyEnum { 
    enum Enum { 
     Value1 /*, ... */ 
    }; 
}; 

template <IntegralType> // **CHANGED** 
struct MyEnumTemplate {}; 

template <> 
struct MyEnumTemplate<MyEnum::Value1> {}; 

// Then the user wants to use the library: 
typedef LibraryT<MyEnumTemplate> MyLibrary; // **CHANGED** 

int main() { 
    MyLibrary library; 
} 
+0

यदि यह प्रासंगिक हो, तो वीसी ++ 2010 या 2012? – ildjarn

+0

@idjarn सबसे हालिया: एमएसवीसी ++ 11 कंपाइलर (इसे वीएस 2012 में शामिल किया गया है) –

+0

@ ओंडरसन मैं इस मामले में विश्वास करता हूं कि 'टाइपनाम' भाग वैकल्पिक है, इसमें कोई फर्क नहीं पड़ता –

उत्तर

3

यह विजुअल C++ संकलक में एक ज्ञात बग है।

C++ compiler bug - cannot use template parameters inside nested template declaration

सिफारिश की वैकल्पिक हल के लिए एक पूर्णांक प्रकार का उपयोग करने के लिए है: (रेप्रो थोड़ा अलग है, लेकिन इस मुद्दे को प्रभावी ढंग से एक ही है) अधिक जानकारी के लिए Microsoft कनेक्ट पर निम्नलिखित बग देखें टेम्पलेट टेम्पलेट पैरामीटर का टेम्पलेट पैरामीटर, जो आपने अपने "संभव (लेकिन अवांछित) समाधान में किया है।"

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