0

ヘッダー ファイルでジェネリック関数宣言を行い、その後の定義を定義ファイルで行うことはできますか?

私はこのようなことをしたいです

HEADER FILE:

#ifndef PROCEDURES_H
#define PROCEDURES_H
template<class T>
T max(const T&, const T&);
#endif

DEFINITION FILE:

#include "procedures.h"
template<class T>
T max(const T& left, const T& right)
{
    return left > right ? left : right;
}

これにより、リンカー エラーが発生します。

もちろん、すべてをヘッダーに入れるだけで問題なく動作します。

4

1 に答える 1

3

テンプレート定義を実装 (ヘッダー以外の) ファイルに入れることができます。ただし、コンパイラはおそらくインスタンス化を行いません。コンパイラは、定義が表示されたときに使用されるもののみを暗黙的にインスタンス化します。代わりに、自分でインスタンス化を行う必要があります。過去に、次の 3 種類のファイルがあると便利であることがわかりました。

  1. 関数テンプレートまたはメンバー関数テンプレートを宣言するヘッダー ファイル。
  2. テンプレート定義ファイルはヘッダー ファイルによく似ていますが、それぞれのヘッダーで宣言された [member] 関数テンプレートを定義します。
  3. 必要に応じてテンプレート定義ファイルをインクルードし、[メンバー] 関数テンプレートを明示的にインスタンス化するソース ファイル。

特定のテンプレートに対して明示的なインスタンス化が可能かどうかは、実際に使用されている異なるインスタンス化の数によって異なります。アルゴリズムやクラス テンプレートではおそらく実現不可能ですstd::vector<T>が、インスタンス化が 2 つしかない IOStream テンプレートなどでは確かに実現可能です。

テンプレートを含むソースを整理するための詳細を次に示します。

于 2013-11-03T23:23:33.057 に答える