Следующий фрагмент кода представляет собой сокращенный пример большого проекта, который я пытаюсь перенести с 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 ++ мне не хватает?