トップレベルのテンプレートでなくても、テンプレート (またはテンプレートの一部、超正確な定義がわからない) であるため、ヘッダーに実装する必要があります (技術的には、ソースに含めることができます)。それが使用される唯一の場所である場合は、ファイルを削除しますが、それはおそらく目的を無効にします)。
注: クラス定義とインラインでメンバー関数を実装しない場合は、次のような構文が必要です。
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(...)
{
// ...
}
編集:少なくともGCCでは、関数のfoo
代わりに上にあるようですfoo<T2>
(したがって、それが標準的な動作であるとほぼ100%確信しています)...言語弁護士が理由を説明できると確信しています:)
等。