源代码在GCC中编译,但不在Visual Studio中编译

时间:2011-07-21 18:58:00

标签: c++ metaprogramming

这在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'

3 个答案:

答案 0 :(得分:3)

假设有效且无冲突的stdafx.h,看起来像有效代码。

你会发现有人告诉你,在C ++中,如果没有隐藏任何内容enum Name,你就不必说struct NameName(就像一个名为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;