2012-10-04 11 views
10

Kod

İşte

benim 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; 
} 
+0

sonuçta ilişkiyi olmak biter halinde, ++ 2010 veya 2012 VC? @idjarn – ildjarn

+0

En yenisi: MSVC++ 11 Derleyici (o 2012 VS dahildir) –

+0

@ahenderson ben bakmadım –

cevap

3

integral yerine enum türüne faaliyet gösteren (istenmeyen, ancak çalışma) olduğunu.

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

önerilen geçici çözüm için bir tamsayı türü kullanmaktır: (üreme biraz farklıdır, ancak konunun etkili bir şekilde aynıdır) Daha fazla bilgi için Microsoft Connect aşağıdaki hata Bkz Şablon şablon parametresinin şablon parametresi, "olası (ama istenmeyen) çözümünüzde yaptığınız şeydir."