Он по-прежнему является либо шаблоном (или частью шаблона, не знает сверхточных определений), даже если он не является шаблоном верхнего уровня, поэтому вы должны необходимо, чтобы должен реализовать его в заголовке (технически, он может быть в исходном файле, если это единственное место, которое он использует, но это, вероятно, побеждает цель).
Примечание: если вы не собираетесь выполнять свои функции-члены рядный с определением класса, вам нужно синтаксис как:
template<typename T>
void A<T>::B::foo(...)
{
// ...
}
Кроме того, потому что это придумали раньше, если B
случилось иметь свой собственный шаблон параметра, это будет что-то вроде:
template<typename T>
template<typename T2>
void A<T>::B<T2>::foo(...)
{
// ...
}
Не:
template<typename T, typename T2>
void A<T>::B<T2>::foo(...)
{
// ...
}
Или если B
не сделал, но B::foo
сделал, это было бы:
template<typename T>
template<typename T2>
// void A<T>::B::foo<T2>(...) // not this apparently
void A<T>::B::foo(...)
{
// ...
}
EDIT: по-видимому, это foo
выше вместо foo<T2>
для функции, по крайней мере, с GCC (так что почти 100% уверен, что это стандарт поведение) ... Я уверен, что некоторый язык адвокат будет в состоянии объяснить, почему :)
Etc.
'B' действительно зависит от параметра шаблона' в вашем Т *. Например, Не напрямую, а 'A :: B' и' A :: B' - несвязанные типы. –
Yakk
Наверное, не имеет значения, но я думаю, что 'typename T' предпочитает' class T' в настоящее время. По крайней мере, это то, что «классные дети», похоже, делают. –
@ StephenLin - да, некоторые люди считают, что здесь полезно использовать «typename», но «класс» правильный, короче, и это способ, которым стандарт C++ пишет шаблоны. Нет хорошей технической причины использовать 'typename' вместо' class'. –