2

テンプレート定義はすべてヘッダー ファイルに入れる必要があることはわかっています [1]。しかし、クラスにテンプレートと非テンプレートの両方がある場合はどうすればよいですか:

// cls.h
class cls {
public:
    template <typename U> void bar(U x);   // template
    void baz();                            // non-template
    template <typename V> class nest {
    };
};

// foo1.cpp
#include "cls.h" ...

// foo2.cpp
#include "cls.h" ...

理想的には、 と は非常に密接に関連しているため、同じファイルに定義barしたいと考えています。baz

  • しかし、ヘッダーのすべての実装をチャックすると、複数定義することになりbazます。
  • すべての実装を a にチャックすると、 and.cppの定義はorから見えなくなります。barnestfoo1.cppfoo2.cpp

別々のファイルに分割する必要がbarありますか?baz

[1] テンプレートを as として宣言してinlineも、NVCC を使用して CUDA コードをコンパイルする MSVC++ ではうまくいかないようです。

4

1 に答える 1

5

しかし、ヘッダーのすべての実装をチャックすると、baz を複数定義することになります。

の関数定義をbaz()としてマークすることもできinlineます。baz()これにより、複数のシンボル定義エラーを引き起こすことなく、ヘッダー ファイルにの定義を入れることができます。

すべての実装を .cpp に入れると、bar とネストの定義が foo1.cpp または foo2.cpp から見えなくなります。

.cpp関数テンプレートのインスタンス化に使用する型が事前にわかっている場合は、関数テンプレートの定義を含むファイルで明示的なインスタンス化を使用できます。

template void cls::bar(int);

上記のオプションのいずれも問題がない場合は、この要件を放棄する必要があります。

理想的には、bar と baz は非常に密接に関連しているため、同じファイルで定義したいと考えています。

そして、メンバー関数テンプレートの定義をヘッダー ファイルに入れ、非テンプレート メンバー関数の定義を.cppファイルに入れます。

于 2013-05-11T10:35:23.250 に答える