gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:19:41 24 4
gpt4 key购买 nike

代码

这是 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++ 编译器 [EDIT: MSVC++ 11 Compiler (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++ compiler bug - cannot use template parameters inside nested template declaration

推荐的解决方法是为模板模板参数的模板参数使用整数类型,这是您在“可能(但不希望)的解决方案”中所做的。

关于c++ - 具有枚举规范的模板模板类在 MSVC++ 编译器 : C3201 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12734658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com