Является ли Visual C ++ правильным, когда он отказывается от этого «зависимого» от шаблона перечисления? - PullRequest
1 голос
/ 05 ноября 2011

Код:

#ifdef _MSC_VER
#    pragma warning( disable: 4480 )     // enum base as "nonstandard extension"
#endif
enum ShouldBeFine: char { hola };

enum Choice { a, b, c };

template< Choice c > struct Traits;

template<> struct Traits<a> { typedef char Type; };
template<> struct Traits<b> { typedef wchar_t Type; };
template<> struct Traits<c> { typedef long Type; };

template< Choice c >
struct Blah
{
    enum X: typename Traits<c>::Type {};
};

int main()
{} 

Только после Herculean усилия , чтобы подать отчет об ошибке в Microsoft, мне пришло в голову, что, возможно, Visual C ++ прав, отказавшись от него, и g ++, который компилирует выше хорошо, может быть не так?

РЕДАКТИРОВАТЬ Подробности: код не может быть скомпилирован с Visual C ++ 10.0 и с предварительным просмотром Visual C ++ 11.0. Эти компиляторы выдают лавинообразную ошибку, начиная с предполагаемой синтаксической ошибки. Код прекрасно компилируется с MinGW g ++ 4.4.1. Dani сообщает, что он отлично работает с CLang. К сожалению, Comeau Online не поддерживает эту языковую функцию, поэтому ее нельзя решить так, как мы это часто делали для C ++ 98, просто передайте код Comeau.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Если я правильно читаю грамматику, вы правы в том, что это должно скомпилироваться.enum-base - это : type-specifier-seq, а type-specifier-seq, по-видимому, включает практически любое имя типа, которое вы можете себе представить, включая typename Traits<c>::Type.И все три специализации приводят к тому, что Type является интегральным, что также требуется от enum-base.Так что мне это кажется кошерным.

0 голосов
/ 06 марта 2012

Это было исправлено в бета-версии Visual C ++ 11, выпущенной 29 февраля 2012 года.

Обратите также внимание, что отключенное предупреждение - C4480 - также исправлено, поэтому оно больше не является неправильнымиспускается в собственном коде C ++ при использовании enum class.

0 голосов
/ 05 ноября 2011

Это прекрасно компилируется как в clang, так и в g ++.Кроме того, замена шаблона должна произойти до того, как будет создан класс и перечисление внутри, поэтому не должно иметь значения, зависит ли его шаблон от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...