Я считаю, что это заголовочный файл, включающий цикл, что означает, что A включает B, B включает A.
Обычно это приводит к таким проблемам. В ваших файлах cpp, независимо от того, что вы вначале включаете, в какой-либо последовательности он всегда сообщает о таких проблемах.
Решение не использовать цикл включения.
Полагаю, у вас нет файлов cpp. Тогда, возможно, вы сможете ввести другой hpp-файл, type.hpp, который чисто определяет интерфейс класса, но не реализует его, тогда в A.hpp и R.hpp вы можете написать код функции-члена.
type.hpp
class A; // forward declaration because the APtr_t is used inside the A class too.
typedef boost::shared_ptr<A> APtr_t;
...
class A {
...
void some_method ();
...
};
class R {
...
APtr_t method();
...
};
a.hpp
#include "type.hpp"
void A::some_method () {
...
R::get()->mehod(); // singleton ;)
...
}
r.hpp
#include "type.hpp"
....