具有枚举规范的模板模板类在 MSVC++ 编译器 C3201 上失败

Template template class with enum specification fails on MSVC++ Compiler: C3201

本文关键字:编译器 MSVC++ C3201 失败 枚举      更新时间:2023-10-16

Code

这是我问题的SSCCE示例:

// 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<MyEnum::Enum, MyEnumTemplate>更改为LibraryT<typename MyEnum::Enum, MyEnumTemplate>不起作用]

错误

我想要的功能是能够基于枚举和该枚举专用的类创建库。 以上是我的第一次尝试。 我相信这是 100% C++,GCC 支持我并说这一切都有效。 但是,我希望它使用 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编译器(VS 2012)]像我的代码一样? 是通过一些添加规格还是不同的方法?

可能(但不理想)的解决方案

将枚举类型硬编码为某种整型类型(基础类型)。 那就没问题了。 但是我的库在积分而不是枚举类型上运行(不希望,但有效)

// 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;
}
这是

Visual C++编译器中的一个已知错误。 有关详细信息,请参阅 Microsoft Connect 上的以下错误(重现略有不同,但问题实际上是相同的):

C++编译器错误 - 不能在嵌套模板声明中使用模板参数

建议的解决方法是对模板模板参数的模板参数使用整数类型,这是您在"可能(但不需要)的解决方案"中所做的。