Исходные компиляции в GCC, но не Visual Studio - PullRequest
2 голосов
/ 21 июля 2011

Это компилируется в 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 ]

3 голосов
/ 21 июля 2011

Предполагая действительный и не конфликтующий stdafx.h, он выглядит как действительный код.

Вы обнаружите, что люди говорят вам, что в C ++ вам не нужно говорить enum Name или struct Name, если ничего не скрывается Name (как функция с именем Name).В C вы должны это сделать, потому что у C другая концепция поиска имен.Но в C ++ для ссылки на структуру, класс, объединение или перечисление вы можете просто использовать Name.Таким образом, вы можете использовать Attribute вместо enum Attribute.Но другой выбор наименования типа не должен заставлять компилятор отклонять ваш код.

0 голосов
/ 21 июля 2011

Я не уверен, в чем именно заключается проблема - я предполагаю, что он рассматривает enum Attribute как начало нового объявления enum ... возможно, как члена Tag_Value.Таким образом, у вас есть два Attribute перечисления, и это не позволит вам специализировать одно с другим.

Чтобы исправить, просто избавьтесь от enum:

template<enum Attribute> struct Tag_Value;

к этому:

template<Attribute> struct Tag_Value;
0 голосов
/ 21 июля 2011

Вам нужно изменить эту строку:

template<enum Attribute> struct Tag_Value; 

На это:

template<Attribute> struct Tag_Value;

Предполагая, что вы захотите принять аргумент шаблона типа Attribute (enum это тип, да).

...