我正在从事的项目中有几个课程;第一个是 Solver 类,最初带有一个函数模板,其完整定义在 Solver 头文件中,如下所示(仅显示基本必需品):
求解器.h
class Solver {
public:
template<typename T>
void solve(T t);
}
template<typename T>
void Solver::solve(T t) {
// implementation here
}
现在,类 A 用作求解函数模板的模板参数,如下所示:
啊
#include "solver.h"
class A {
private:
Solver s; //s is instantiated in constructor
public:
void doSomething();
}
A.cpp
void A::doSomething() {
s.solve<A&>(*this);
}
所以这一切都很好,就像现在一样,但为了项目的目的,我需要将solver()函数模板的定义从头文件中移动到一个实现文件(solver.cpp)中。据我了解,只要我添加明确说明函数模板将使用哪些类型的行,我就可以做到这一点,如下所示:
求解器.cpp
template<typename T>
void Solver::solve(T t) {
// implementation here
}
template void Solver::solve<A&>(A& a);
但是,当我尝试编译求解器时,这不起作用,因为为了将 A 指定为我想在 solve.cpp 中用作模板参数的类型,我需要 A 不是不完整的类型。但是 A 需要 Solver 才能编译 - 所以我相信我有一个循环依赖。有什么办法可以解决这个问题吗?
我对这一切都比较陌生,所以请放轻松:) 非常感谢。