0

重複の可能性:
テンプレートをヘッダーファイルにのみ実装できるのはなぜですか?

理解できなかったものに出くわしました。次の場合、リンク段階で問題が発生しました。

//header file
class A 
{
    template<class T>
    std::weak_ptr<T> GetSomethingFromSomeWhere(const char* Id);
};

//cpp file
template<class T>
std::weak_ptr<T> A:GetSomethingFromSomeWhere(const char* id)
{
   //A method with the right stuff inside and the right return statement
   ...
}


//Another class
class B
{
};

//main.cpp
int main ()
{
   A a;
   auto pB = a.GetSomethingFromSomeWhere<B>( "id" );
}

これはコンパイルされませんでした、リンク中に私はこの種のものを持っています:

アーキテクチャx86_64の未定義のシンボル: "std :: __ 1 :: weak_ptr A :: GetComponentFromName(char const *)"、参照元:_main in main.o ld:シンボルがアーキテクチャx86_64で見つかりませんclang:エラー:リンカーコマンド終了コード1で失敗しました(呼び出しを確認するには-vを使用してください)

テンプレートメソッドをヘッダーファイルで直接定義することで修正しました。

常にヘッダーでテンプレートメソッドを定義する必要がありますか?なんで ?私はOSXを使用しており、XCodeでclang++を使用しています。

ありがとう

4

1 に答える 1

1

テンプレート定義は、それを使用するコードから見える必要があります。そうしないと、リンカ エラーが生成されます。そのような状況には、さまざまな回避策があります。

これを読む

于 2012-10-27T11:02:23.220 に答える