В частности, мне нужно объявить (насколько я понимаю) intrusive_ptr_{add_ref,release}
друзьями моего класса:
#include <boost/intrusive_ptr.hpp>
using boost::intrusive_ptr;
class Outer {
public:
//user-exposed interface goes here
protected:
class Inner {
public:
Inner():refct(0){}
virtual ~Inner(){}
//machinery goes here
size_t refct;
};
friend void boost::intrusive_ptr_release(Inner *p);
friend void boost::intrusive_ptr_add_ref(Inner *p);
intrusive_ptr<Inner> handle;
};
namespace boost {
void intrusive_ptr_release(Outer::Inner *p){
if ((p->refct -= 1) <= 0){
delete p;
}
}
void intrusive_ptr_add_ref(Outer::Inner *p){
p->refct++;
}
};
У меня возникают проблемы с поиском правильного синтаксиса для компиляции и сохранениядоступ, который я хочу.Моя главная проблема в том, что gcc, кажется, расстроен тем, что "boost :: intrusive_ptr_release (Outer :: Inner * p) должен был быть объявлен в boost пространства имен".
Я вижу из этот пример что хелперы intrusive_ptr объявляются вперед в boost пространства имен - но я не могу forward объявить их, потому что, насколько я понимаю, вложенные классы (то есть "Inner", к которым относятся эти функции) могут толькобыть заранее объявленным внутри их внешних классов, и вот где объявление друга тоже должно идти.
О, великие гуру C ++, как правильно справиться с этим?