2

テンプレート化されたクラスとテンプレート化されていないクラスを同じ .cpp ファイルに含めると、リンク時に問題が発生します。

C++ FAQ 35.13,35.14,35.15 を調べましたが、問題は解決しません。

http://www.parashift.com/c++-faq-lite/separate-template-class-defn-from-decl.html

私はclangでXcode 5を使用しています。

これが例です

barfoo.h

class bar{
public:
   void barfunc();
};

template <class T>
class foo{
public:
   void foofunc();
};

cpp ファイルは次のとおりです。

barfoo.cpp

void bar::barfunc(){...my code...}
template <class T>
void foo<T>::foofunc() {...my code...}
//I also put a instance of template class foo in the .cpp file
template class foo<int>;
//But is still generates the link error

エラーは

clang: エラー: リンカー コマンドが終了コード 1 で失敗しました (呼び出しを確認するには -v を使用してください)

しかし、バークラスを削除すると、エラーが消えます。なぜこのエラーが発生するのか教えてもらえますか?

ヘッダーファイルに定義を入れると問題を解決できますが、コードの肥大化という別の問題が発生する可能性があります。別の解決策を提供できる人はいますか?

4

1 に答える 1

1

問題が見つかりました。問題は、テンプレート クラスをコードで使用している型にインスタンス化しなかったことです。

テンプレートのインスタンス化の問題を解決するソリューションは次のとおりです。

  1. コンパイラがインスタンス情報を持つように、ヘッダー ファイルに定義を入れます。(不利な点、読み込みとコンパイルの時間が長くなります)

  2. コードで使用するすべての型をインスタンス化します

于 2015-02-06T16:54:13.923 に答える