2016-08-22 8 views
1

私は何らかの理由でテンプレート関数をヘッダファイルに定義しなければならないことを知っています。しかし、テンプレート以外の関数はテンプレートクラスに属していても.cppファイルで定義できると私は信じていました。それは許されますか?そうでない場合は、どうしてですか?ありがとうございました:).cppファイル内のテンプレートクラスの非テンプレートメソッド - 未定義の参照?

+0

ええと、メソッドのシグネチャやメソッドのコードに表示されない場合でも、テンプレートクラスはすべてテンプレートです。クラスレイアウトでさえ、一般にテンプレート引数に依存することに注意してください(テンプレート引数が現れないメソッドの生成コードは異なるテンプレートのインスタンス化によって異なる場合があります)。標準に対するより混乱したルールすべてのテンプレート不変のものを基本クラスに移動する簡単な解決策は、私にとってはより良い選択です。 –

答えて

3

実際には、ヘッダー/使用時点で(明示的なインスタンス化が起こらない限り)定義されているものは、「テンプレート化されたエンティティ」です。これまでのC++ではこのような用語はありませんが、テンプレートだけでなく、多くのルールが「テンプレート化されたエンティティ」に適用されるため、プロポーザルが言語に追加されています。

は、理由は明らかであるhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0391r0.html

を参照してください。テンプレートのように、テンプレートのメンバーはテンプレートパラメーターを使用できます。そのため、ソースはインスタンシエーションに使用できる必要があります。

メンバ関数がテンプレートパラメータを使用しない場合、この問題を回避するためのトリックは、テンプレート以外の基本クラスに関数を置き、そのクラスをクラステンプレートから継承することです。

+0

ご協力ありがとうございます。したがって、基本的に.cppには、テンプレートタイプを使用しない非テンプレートメンバ関数を実装することはできません。なぜなら、必要な情報がコンパイラにはなく、C++の制限のためにだけではないからです。 – Virus721

+0

それだけではないと思う。しかし、コンパイラは、コンパイル時に、cppファイルをコンパイルするときに、関数がテンプレートパラメータを使用せず、既にコンパイルされていることをテンプレートクラスのユーザーに通知する手段がありません。コールサイトのユーザーは、この機能を別の方法で呼び出すには(テンプレート引数のエンコーディングなどを含むシンボル名を使用しない)、これを知る必要があります。そして、そのような関数がparamsを使用すると考えられていないときには、その言語によって記述されることが要求される規則があります。 「この」カウントを使用していますか? –