0

テンプレートを使用するマルチファイル プロジェクトがあります。

// Foo.h
template <class T>
class Foo
{
    T bar;
};

クラス (例: Cup) とそのクラスのサブクラスがたくさんあります。

// Cup.h
class Cup
{
};

class Chalice : public Cup
{
};

class SippyCup : public Cup
{
};

// ...etc.

テンプレートの .cpp ファイルでは、リンカー エラーを回避するために、考えられるすべてのテンプレート実装をリストする必要があります。これはC++ FAQから学びました。

//Foo.cpp
template class Foo<Cup>;
template class Foo<Chalice>;
template class Foo<SippyCup>;
// ...etc.

実際には、コードの任意の時点で使用したいサブクラスが約 20 以上あります。開発では、常に新しいサブクラスを作成しています。そのため、新しいものを作成するたびに、この増え続けるリストに追加する必要がありFoo.cppます。

これは苦痛です。これらの可能性をすべてリストする必要を回避する方法はありますか?

4

2 に答える 2

4

これを回避する方法は、テンプレート関数の定義を別の .cpp ファイルではなく、ヘッダー ファイル (つまり、実際のテンプレート定義) に入れることです。

于 2013-08-23T18:33:03.017 に答える
0

テンプレートの特殊化のない Foo クラス定義は、.h ファイル (または上記のリンクで述べたような .tpp ファイル) 内に存在する必要があります。ただし、テンプレートに特化したクラス定義は、.h ファイル (または .tpp ファイル) でその型の前方宣言を使用して .cpp ファイルで定義する必要があります。たとえば、Cup then に対して別のテンプレート クラス定義が必要な場合

// Foo.h
template <class T>
class Foo
{
  T bar;
};

template<> class Foo<Cup>;

次に、同じヘッダー ファイルまたは別のヘッダー ファイル内で、この特殊な形式のテンプレート クラスの別の宣言を行うことができます。すべてのテンプレート メンバー関数とクラスのテンプレート化された (非 slecialized 表現) のコンストラクターは .h ファイル (または .tpp ファイル) 内にある必要がありますが、Cup に特化したテンプレート クラスのコンストラクターは .cpp ファイル内にある必要があります。リンカー エラーを回避します。また、インラインでない場合は、特殊化されていないテンプレート クラスと特殊化されたテンプレート クラスの両方のテンプレート化されていないすべてのメンバー関数を .cpp ファイルで定義する必要があります :) 。お役に立てれば!!!!

于 2013-08-23T19:35:11.447 に答える