У меня есть несколько классов в проекте, над которым я работаю; первый класс Solver, первоначально с шаблоном функции, полное определение в файле заголовка Solver, например, так (просто показывая самое необходимое):Проблема с циклической зависимостью C++ с шаблонами функций
solver.h
class Solver {
public:
template<typename T>
void solve(T t);
}
template<typename T>
void Solver::solve(T t) {
// implementation here
}
Теперь, класс А используется в качестве параметра шаблона для решения шаблона функции следующим образом:
Ah
#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);
}
Итак, все это прекрасно и денди, как сейчас, но для целей проекта мне нужно перенести определение шаблона функции solve() в файл реализации (solver.cpp) из файл заголовка. Как я понимаю, что я могу сделать это до тех пор, как я добавить строки, которые четко указано, какие типы будут использоваться с шаблоном функции, следующим образом:
solver.cpp
template<typename T>
void Solver::solve(T t) {
// implementation here
}
template void Solver::solve<A&>(A& a);
Однако это не работа, когда я пытаюсь скомпилировать решатель, потому что для того, чтобы указать A как тип, который я хочу использовать в качестве параметра шаблона в файле solve.cpp, мне нужно, чтобы A не был неполным. Но A требует Solver для того, чтобы даже скомпилировать - поэтому я считаю, что у меня круговая зависимость. Есть ли способ обойти эту проблему?
Я относительно новичок во всем этом, так что успокойте меня, пожалуйста :) Большое спасибо.
Я пробовал это сделать, но компилятор дал мне «ошибку: недопустимое использование неполного типа« struct A »для каждого момента, когда A ссылается на функцию решения, так как а также «ошибка: форвардная декларация« struct A » – user2548415
А хорошо. Вы упростили выборку. Конечно, вы можете просто включить 'A.h' внутри' Solver.cpp' ** и всегда помнить о защите заголовков. ** (отредактировано) – sehe
sehe, вы замечательный человек. это сработало! огромное спасибо. и да, я упростил пример ... моя ошибка. =/там были защитники заголовка, и я забыл включить их в образец. – user2548415