这在GCC 4.6上编译但不与VS2010 sp1:
编译
这是我的错还是VS搞砸了?
#include "stdafx.h"
enum Attribute{red_att,black_att,key_att,value_att};
struct Color{};
template<enum Attribute>
struct Tag_Value;
template<>
struct Tag_Value<red_att>
{
typedef Color type;
};
int main()
{
return 0;
}
错误:
error C2599: 'Attribute' : forward declaration of enum type is not allowed
error C2440: 'specialization' : cannot convert from 'Attribute' to 'Attribute'
答案 0 :(得分:3)
假设有效且无冲突的stdafx.h
,看起来像有效代码。
你会发现有人告诉你,在C ++中,如果没有隐藏任何内容enum Name
,你就不必说struct Name
或Name
(就像一个名为Name
的函数)。在C中你必须这样做,因为C有一个不同的概念来查找名字。但是在C ++中,要引用struct,class,union或enum,只需使用Name
即可。因此,您可以使用Attribute
代替enum Attribute
。但命名类型的不同选择不应该使编译器拒绝您的代码。
答案 1 :(得分:0)
你必须改变这一行:
template<enum Attribute> struct Tag_Value;
对此:
template<Attribute> struct Tag_Value;
假设您要接受类型Attribute
的模板参数(枚举是一种类型,是的)。
答案 2 :(得分:0)
我不确定究竟是什么问题 - 我的猜测是它将enum Attribute
视为新枚举声明的开头......也许是作为Tag_Value的成员。所以你有两个Attribute
枚举,它不会让你专注于另一个。
要修复,只需摆脱enum
:
template<enum Attribute> struct Tag_Value;
到此:
template<Attribute> struct Tag_Value;