Подтвердить что ты не робот

Шаблонный шаблонный класс с параметром enum не работает на компиляторе MSVС++: C3201

Код

Вот пример SSCCE моей проблемы:

// My Library, which I want to take in the user 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;
}

[ EDIT: изменение LibraryT<MyEnum::Enum, MyEnumTemplate> до LibraryT<typename MyEnum::Enum, MyEnumTemplate> не имеет эффекта]

Ошибка

Функциональность, которую я желаю, - это способность создавать библиотеку на основе перечисления и класс, который специализируется на этом перечислении. Выше моя первая попытка. Я считаю, что это 100% С++, и GCC поддерживает меня и говорит, что все работает. Тем не менее, я хочу, чтобы он компилировался с помощью компилятора MSVС++, и он отказывается:

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

Вопрос

Есть ли способ сделать компилятор MSVС++ [ EDIT: MSVС++ 11 Compiler (VS 2012)], как мой код? Либо по некоторым дополнительным спецификациям, либо по другому подходу?

Возможное (но нежелательное) решение

Жестко задайте тип перечисления как некоторый целостный тип (базовый тип). Тогда проблем нет. Но тогда моя библиотека работает с интегралами вместо типа enum (нежелательно, но работает)

// My Library, which I want to take in the user 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;
}
4b9b3361

Ответ 1

Это известная ошибка в компиляторе Visual С++. См. Следующую ошибку в Microsoft Connect для получения дополнительной информации (воспроизведение немного отличается, но проблема фактически одинакова):

Ошибка компилятора С++ - не может использовать параметры шаблона во вложенном объявлении шаблона

Рекомендуемым обходным решением является использование целочисленного типа для параметра шаблона параметра шаблона шаблона, что и было сделано в вашем "возможном (но нежелательном) решении".