Kod
İştebenim sorunun SSCCE örnektir:Şablon şablon sınıfı msvC++ derleyicisi başarısız: 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;
}
[DÜZENLEME: LibraryT<typename MyEnum::Enum, MyEnumTemplate>
için LibraryT<MyEnum::Enum, MyEnumTemplate>
değiştirmenin etkisi olmaz]
Hata
İstediğim işlevsellik bir enum ve bu enum tarafından uzmanlaşmış bir sınıfa dayanan bir kütüphane oluşturma becerisidir. Yukarıda benim ilk denemem. % 100 C++ olduğuna inanıyorum ve GCC beni destekliyor ve her şeyin işe yarayacağını söylüyor. Ancak, bu MSVC++ derleyicisi derlemek istiyoruz ve onu reddeder:
error C3201: the template parameter list for class template 'MyEnumTemplate'
does not match the template parameter list for template parameter 'EnumStruct'
Soru
ben MSVC++ derleyicisi yapabilir bir yolu var mı [DÜZENLEME: MSVC++ 11 Derleyici (2012 VS)] benim kodum gibi mi? Bazı ekleme özellikleri veya farklı yaklaşım ile?
Çözüm Mümkün (ancak istenmeyen)
Sert kod enum türü bazı ayrılmaz türü (altta yatan tipi) olmak. O zaman sorun yok. Ama sonra benim kütüphane Bu, Visual C++ derleyici içinde bilinen bir hatadır
// 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;
}
sonuçta ilişkiyi olmak biter halinde, ++ 2010 veya 2012 VC? @idjarn – ildjarn
En yenisi: MSVC++ 11 Derleyici (o 2012 VS dahildir) –
@ahenderson ben bakmadım –