Работает так же, как и при использовании не-шаблона: вы должны полностью указать имя участника:
struct outer {
struct nested;
};
struct outer::nested {
int
test();
};
int
outer::nested::test()
{ /* whatever */ }
В вашем случае это будет:
template <typename A, typename B>
class MyTemplateClass {
public:
class InnerClass;
friend class InnerClass;
};
// note the use of the <> brackets
template<typename A, typename B>
class MyTemplateClass<A, B>::InnerClass {
public:
A
test();
};
// ditto
template<typename A, typename B>
A
MyTemplateClass<A, B>::InnerClass::test()
{ return 0; }
Вы do должны быть осторожны с порядком определения: если, например, MyTemplateClass
имеет функции-члены, которые используют InnerClass
, тогда определение InnerClass
должно быть видно в точке использования.
Простое правило: встроить все или ничего. Либо вы определяете все встроенное (InnerClass
определение класса и члены-функции обоих классов) внутри MyTemplateClass
, либо вы помещаете все определения всех членов функции (как MyTemplateClass
, так и * 1019). *) в самом конце после определения InnerClass
.
Не беспокойтесь, если вы все испортите, ваш компилятор будет только рад помочь вам с сообщениями об ошибках.