1

编译以下代码时出现链接器错误:

这里是头文件:

// 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>;,因此编译器知道定义类型的实例。

4

0 回答 0