以下编译非常精细:
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
// ^^^^^
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个小时才搞清楚。在这种复杂情况下产生的错误完全是误导。]