在模板类中初始化std :: vector

时间:2012-05-31 09:08:10

标签: c++ templates linker stdvector

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

这里是头文件:

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

0 个答案:

没有答案