Использование члена класса шаблона для создания экземпляра параметра шаблона по умолчанию в MSVC ++ - PullRequest
1 голос
/ 18 июля 2010

Следующий фрагмент кода представляет собой сокращенный пример большого проекта, который я пытаюсь перенести с GCC / G ++ на Microsoft Visual C ++ 2010. Он прекрасно компилируется с G ++, но с MSVC ++ выдает ошибки, и явозникают проблемы с пониманием почему.

template <typename A, typename B = typename A::C::D>    // line 1
struct foo
{
  typedef int type;
};

template <template <typename> class E, typename T>
typename foo<E<T> >::type                               // line 8
bar(){}

Сообщения об ошибках от MSVC ++:

example1.cpp(1) : error C2027: use of undefined type 'E<T>'
example1.cpp(8) : error C2146: syntax error : missing ',' before identifier 'D'
example1.cpp(8) : error C2065: 'D' : undeclared identifier

Я попытался несколько изменений, чтобы немного сузить проблему, и пока я неЯ не совсем понимаю, вот что я обнаружил: если в строке 1 я заменяю A::C::D на A::C, все работает нормально.Если я заменим template <typename> class E на typename E и сделаю foo<E>, все будет работать нормально.Если явно указать второй аргумент шаблона для foo в строке 8, вот так, он работает нормально:

typename foo<E<T>, typename E<T>::C::D>::type          // line 8

И, если я заменю использование A::C::D на что-то безобидное, например, typename B = A встрока 1, но добавьте другое использование A::C::D как typedef typename A::C::D qux; к определению foo, это также хорошо работает.

Есть идеи?Какой бит правил C ++ мне не хватает?

1 Ответ

1 голос
/ 08 августа 2010

Я сообщил об этом как об ошибке в Microsoft согласно предложению jpalecek, и Microsoft подтвердила, что это действительно ошибка в их компиляторе:

https://connect.microsoft.com/VisualStudio/feedback/details/576196

...