Этот вопрос закрыт, потому что считается дубликатом:Заголовки, нуждающиеся друг друга
- C++ cyclical header dependency
- cyclic dependency between header files
- C++ error: 'Line2' has not been declared
Однако другой вопрос отличается от моего: они спросите другое дело, и ответ не работает с моей проблемой. Их ответ предполагает включить функцию в файл .cpp
и определить класс перед объявлением. Я не могу поместить функцию в .cpp
, потому что мой класс является шаблоном, и я уже определяю класс, но это не полезно.
У меня есть два файла заголовка a.h
и b.h
. В них определены два шаблонных класса A
и B
.
Функция A
нужна работа с объектом B
и наоборот. Поскольку они являются классами шаблонов, я не могу поместить функцию в файл .cpp
, он должен оставаться в заголовке, и у меня большая головная боль из-за порядка включения.
Что такое хорошая методология для решения этой проблемы?
В настоящее время я перемещаю определение функции и нахожу способ включения заголовков в правильном порядке, но это становится все более сложным. Более того, мне не нравится иметь определение функции далеко от объявления класса (например, в другом файле).
Пример кода:
хиджры
#ifndef A_H
#define A_H
#include <iostream>
#include "b.h"
template< typename T > class B;
template< typename T >
class A {
public:
B<void> *b;
void f();
void g();
};
template< typename T > void A<T>::f() {
std::cout << "A::f" << std::endl;
b->f();
}
template< typename T > void A<T>::g() {
std::cout << "A::g" << std::endl;
}
#endif
b.h
#ifndef B_H
#define B_H
#include <iostream>
#include "a.h"
template< typename T > class A;
template< typename T >
class B {
public:
A<void> *a;
void f();
void g();
};
template< typename T > void B<T>::f() {
std::cout << "B::f" << std::endl;
}
template< typename T > void B<T>::g() {
std::cout << "B::g" << std::endl;
a->g();
}
#endif
main.cpp
#include "a.h"
#include "b.h"
int main() {
A<void> a;
B<void> b;
a.b = &b;
b.a = &a;
a.f();
b.g();
return 0;
}
Это не работает, потому что a.h
включает b.h
. b.h
тогда не может включать a.h
и таким образом B::g
является ошибкой.
Для этого примера кода я могу перемещать B::g
в main.cpp
или в конце a.h
, но с более сложной программой это непросто.
http://stackoverflow.com/questions/5239943/c-cyclical-header-dependency http://stackoverflow.com/questions/2089056/циклическая зависимость между заголовками-файлами http://stackoverflow.com/questions/5058363/c-error-line2-has-not-been-declared/5058627#5058627 <- Dupes –
Показать нас некоторый ** минимальный ** код, к сожалению, нет возможности сократить это. –
@BillyNeal: нет, мой случай отличается от моего класса шаблоном: я не могу поместить объявление функции в исходный файл, а также объявить класс ('class A;') не решить мою проблему. –