Почему компиляция завершается неудачно, когда имя параметра шаблона совпадает с именем внутреннего класса?

Следующие компиляции прекрасно работают:

struct MyClass {
template<typename SameName>
void foo (SameName* p);
};
struct SameName {};

template<class SameName>
void MyClass::foo (SameName* p) {}

Тем не менее, если мы приложим MyClass а также SameName внутри некоторых class Outer тогда template функция определена снаружи, не компилируется.

struct Outer {
/* paste here `MyClass` & `SameName` from above */
};

template<class SameName>
void Outer::MyClass::foo (SameName* p) {}  // <--- error here
//   ^^^^^

ошибка g ++ (03-14) странно:

error: prototype for ‘void Outer::MyClass::foo(Outer::SameName*)’ does not match any in class ‘Outer::MyClass’
void Outer::MyClass::foo (SameName* p) {}
^~~~~
templateClassMethod.cpp:6:10: error: candidate is: template<class SameName> void Outer::MyClass::foo(SameName*)
void foo (SameName* p);

Ошибка лягушки (03-14) менее интуитивна:

error: out-of-line definition of 'foo' does not match any declaration in 'Outer::MyClass'
void Outer::MyClass::foo (SameName* p) {}

Вопрос:

  • Это ошибка языка / компилятора или ожидаемое поведение?
  • Если ожидается, то почему выбор за template имя типа ограничено для внутренних классов?

[Примечание: На самом деле у меня было много параметров шаблона, и случайно один из них совпадал с именем внутреннего класса, случайно. Мне потребовался 1 час, чтобы выяснить. Ошибка, возникшая в этом сложном сценарии, полностью вводит в заблуждение.]

5

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …