重複の可能性:
テンプレートをヘッダーファイルにのみ実装できるのはなぜですか?
理解できなかったものに出くわしました。次の場合、リンク段階で問題が発生しました。
//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++を使用しています。
ありがとう