编译以下代码时出现链接器错误:
这里是头文件:
// 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 文件中包含的错误顺序造成的。
评论
这个问题不是重复为什么模板只能在头文件中实现?首先,因为(最明显的)代码可以编译,其次,Solver
模板有一个隐式实例化:template class Solver<ValueFunction>;
,因此编译器知道定义类型的实例。