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

时间:2016-12-22 09:46:20

标签: c++ templates syntax compiler-errors class-method

以下编译非常精细:

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

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

但是,如果我们将MyClassSameName括在一些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很奇怪:

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);

clang(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个小时才搞清楚。在这种复杂情况下产生的错误完全是误导。]

0 个答案:

没有答案