Я знаю, как решить базовый пример циклической зависимости, с двумя классами, где каждый должен знать, что другой существует.
Тем не менее, я сейчас в ситуации, где пример более сложный, и форвардная декларация не является чем-то, что может исправить эту проблему.C++ Циркуляр #include, где форвардное объявление не является фиксированным
Рассмотрим эти три файла
// my_thread.hpp
template<typename Function> class my_thread;
template<typename Return, typename... Input>
struct my_thread<Return(Input...)>
{
void somefunction() { thread_manager::static_function(); }
}
// thread_manager.hpp
struct thread_manager
{
static void static_function() { }
std::list<some_class::thread_type> threads;
}
// some_class.hpp
struct some_class
{
using thread_type = my_thread<int(some_class*)>
}
Теперь, очевидно my_thread.hpp
требует вся thread_manager
(или, по крайней мере, это функция?). thread_manager
требуется using
директива от some_class
и some_class
зависит от my_thread
. Поскольку для контейнеров STL требуются параметры шаблона полного типа, я не могу переслать объявление my_thread
. Я не могу даже определить определение my_thread<T>::somefunction()
, так как это функция шаблона и требует размещения в заголовке.
Вопрос в том, как решить эту круговую зависимость?
И забавная вещь, MSVC не требует #include "thread_manager" in
my_thread.hpp for some reason. I don't know how it knows about
thread_manager`.
то почему вы помещаете определение 'somefunction', прежде чем объявлять' thread_manager'? –
@PiotrSkotnicki Это циклическая зависимость, оба файла требуют друг друга как включить. И 'my_thread :: somefunction()' является шаблоном и должен быть в заголовке. –
Zereges
поместите их в один заголовок, затем (вместе с необходимыми определениями) –