编译以下代码时出现链接器错误:
这里是头文件:
// 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文件中包含的顺序错误。
备注
这个问题首先不是Why can templates only be implemented in the header file?的重复,因为(最明显的)代码编译,其次,Solver
模板有一个隐含的实例化:template class Solver<ValueFunction>;
,因此编译器知道已定义类型的实例。