2012-08-31 9 views
8

での定義は、次の構文を考えてみましょう。テンプレート以外のクラスの場合、このは、インスタンスの静的メンバーに対して複数のシンボルが定義されているため、リンク時エラーが発生します。これはテンプレートでも同様に直感的に思えるので、定義を分離して.cppファイルに入れる必要があります。しかし、テンプレートは通常、ヘッダーのようなファイルで宣言され、定義されます。 この構文を有効にしてテンプレートクラスで機能させることができるのは何ですか?C++のテンプレートと静的メンバヘッダ

ここにはwikipediaというリンクがありますが、テンプレートクラスの場合にどうなるかについて明確な説明はありません。

答えて

13

[basic.def.odr]/5明示的に許可されたテンプレートを複製するので、これは動作します:

外部リンケージでクラス型(第9条)、列挙型(7.2)、インライン関数の複数の定義が存在することができます(7.1 (14.5.1.3)、クラステンプレートのメンバ関数(14.5.1.1)、またはテンプレート特殊化(14.5.1.2)、クラステンプレートのメンバ関数各定義が異なる翻訳単位で表示され、定義が次の要件を満たしていれば、プログラム内でいくつかのテンプレートパラメータが指定されていない(14.7,14.5.5)。 ...

要件はかなり長いので、ここでは重複しませんが、本質的に、それぞれの重複する定義は同一でなければならないと述べています(そうでなければ、プログラムには未定義の動作があります)。