1. ホーム
  2. c++

[解決済み] テンプレート化されたクラスから単一のメソッドをテンプレート化する

2023-02-03 16:46:44

質問

私のテンプレート化されたクラスを含む以下のヘッダが、少なくとも2つの .CPP ファイルに含まれていることを常に考慮し、このコードは正しくコンパイルされます。

template <class T>
class TClass 
{
public:
  void doSomething(std::vector<T> * v);
};

template <class T>
void TClass<T>::doSomething(std::vector<T> * v) {
  // Do something with a vector of a generic T
}

template <>
inline void TClass<int>::doSomething(std::vector<int> * v) {
  // Do something with a vector of int's
}

しかし、特殊化メソッドのインラインに注意してください。これは、メソッドが複数回定義されていることによるリンカーエラー(VS2008ではLNK2005)を避けるために必要です。AFAIK では、完全なテンプレートの特殊化は単純なメソッド定義と同じであるため、私はこれを理解しています。

では、どうすればその inline ? コードは、それを使用するたびに重複してはいけません。私はGoogleで検索し、SOでいくつかの質問を読み、提案されたソリューションの多くを試しましたが、どれもうまく構築できませんでした(少なくともVS 2008では)。

ありがとうございます!

どのように解決するのですか?

単純な関数と同じように、宣言と実装を使用することができます。 ヘッダ宣言に記述してください。

template <>
void TClass<int>::doSomething(std::vector<int> * v);

を実装し、cppファイルのいずれかに実装してください。

template <>
void TClass<int>::doSomething(std::vector<int> * v) {
 // Do somtehing with a vector of int's
}

インラインを削除することを忘れないでください(私は忘れていて、この解決策はうまくいかないと思いました :) )。 VC++2005で確認しました。