当模板参数名称与内部类名匹配时,为什么编译失败?

iam*_*ind 5 c++ syntax templates compiler-errors class-method

以下编译完全正常:

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

template<class SameName>
void MyClass::foo (SameName* p) {}
Run Code Online (Sandbox Code Playgroud)

但是,如果我们附上MyClassSameName一些内class Outertemplate外定义的函数,编译失败.

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

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

克++(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);
Run Code Online (Sandbox Code Playgroud)

clang(03-14)错误不太直观:

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

问题:

  • 这是语言/编译器错误还是预期的行为?
  • 如果需要,那么为什么template类型名称的选择受到内部类的限制?

[注意:实际上我有很多模板参数,顺便提一下其中一个与内部类名相匹配.我花了1个小时才搞清楚.在这种复杂情况下产生的错误完全是误导.]