Следующие компиляции прекрасно работают:
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 час, чтобы выяснить. Ошибка, возникшая в этом сложном сценарии, полностью вводит в заблуждение.]
Задача ещё не решена.
Других решений пока нет …