1

ヘッダーファイルが、テンプレート化されていないクラスが定義されてmyheader.hxxいるクラステンプレートを定義しているとします(これはのテンプレートパラメータに依存しません)。ABA

template<class T>
class A {
    class B { 
        // ...
    };
};

Bこの場合、で実装しても大丈夫ですか、それともリンク時に定義が重複しないようmyheader.hxxに別のファイルを作成する必要がありますか?myheader.cxxこのケースは、さまざまなコンパイラによって一貫して処理されていますか?

4

1 に答える 1

0

トップレベルのテンプレートでなくても、テンプレート (またはテンプレートの一部、超正確な定義がわからない) であるため、ヘッダーに実装する必要があります (技術的には、ソースに含めることができます)。それが使用される唯一の場所である場合は、ファイルを削除しますが、それはおそらく目的を無効にします)。

注: クラス定義とインラインでメンバー関数を実装しない場合は、次のような構文が必要です。

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%確信しています)...言語弁護士が理由を説明できると確信しています:)

等。

于 2013-03-02T02:09:42.077 に答える