2015-06-23 2 views
1

Учитывая два класса шаблонов, каждый из которых имеет функции-члены, которые ссылаются на функции-члены в классе других, как это можно сделать? Если вообще. Используя декларацию forward, чтобы разрешить циклическую зависимость, означает, что определение недоступно для указанной функции-члена. Таким образом, возникает ошибка в отношении неявного экземпляра неопределенного типа. Определения функций-членов не могут быть перенесены в файл cpp с полными определениями классов, включенными вместо передовых объявлений, поскольку они должны существовать в заголовке, чтобы разрешить создание компилятора при использовании/вызове.Циклическая зависимость между функциями класса шаблона

template<typename T> 
class A { 
    void foo(B &b) { b.bar(); }; 
    void bar() {}; 
} 

template<typename T> 
class B { 
    void foo(A &a) { a.bar(); }; 
    void bar() {}; 
} 

Теперь я знаю, что первый ответ будет «изменить код», но я экспериментирую с чем-то, и это единственный способ, которым я могу видеть, чтобы заставить его работать. Поэтому меня интересует, возможно ли это на C++. Большое спасибо заранее!

ответ

5

Объявить один шаблон перед определением другого:

template <typename> class B; 

template <typename T> class A { 
    inline void foo(B<T> &b); 
    inline void bar(); 
}; 

template <typename T> class B { 
    void foo(A<T> &a) { a.bar(); } 
    void bar() {} 
}; 

template <typename T> void A<T>::foo(B<T> &b) { b.bar(); } 
template <typename T> void A<T>::bar() {} 
+0

'inline' сделать что-нибудь там? – Yakk

+0

Проще, чем я думал! Я действительно не видел этого, так как настоящая проблема имеет классы в отдельных заголовочных файлах, но теперь это кажется совершенно очевидным. Поэтому я предполагаю, что я бы поменял класс B на включение, и использовать некоторые из них, чтобы избежать двойного включения определений. Отметьте как ответ, как только я смогу дать ему сегодня вечером. Благодаря! – NitrousUK

+0

@Yakk: Паритет. Исходный код имел определения 'inline', поэтому я не хотел его изменять. –

Смежные вопросы