次のコードをコンパイルすると、リンカー エラーが発生します。
ここにヘッダーファイルがあります:
// Solver.h
#ifndef SOLVER_H_
#define SOLVER_H_
#include <vector>
#include "Resource.h"
#include "ValueFunction.h"
template<typename T>
class Solver {
public:
Solver(std::vector<Resource>& resources);
private:
std::vector<T> valfuncs;
};
#endif /* SOLVER_H_ */
そして、ここにソースファイルがあります:
// Solver.cpp
#include "Solver.h"
template<typename T>
Solver<T>::Solver(std::vector<Resource>& resources) :
valfuncs(resources.size()) {}
// Explicit class declaration
template class Solver<ValueFunction>;
そして呼び出し:
// openadp.cpp
#include "Solver.h"
int main(int argc, char *argv[]) {
std::vector<Resource> resources(4);
Solver<ValueFunction> sol(resources);
return 0;
}
valfuncs(resources.size())
初期化リストから削除すると、コードは正常にコンパイルされます。テンプレート リストから渡されたクラスでベクトルを初期化できないのはなぜですか?
前もってありがとう、レザ
アップデート
申し訳ありませんが、この小さな例ではエラーが再現されません! 私はそうするものを見つけようとしています。
更新 2
リンカ エラーは、cmake ファイルのインクルードの順序が間違っていたことが原因でした。
述べる
この質問は、なぜヘッダー ファイルにのみテンプレートを実装できるのですか?の複製ではありません。1 つ目は (最も明白な) コードがコンパイルされるため、2 つ目はSolver
template:の暗黙的なインスタンス化があるtemplate class Solver<ValueFunction>;
ため、コンパイラは定義された型のインスタンスを認識します。