Использование boost :: intrusive_ptr с вложенными классами - PullRequest
4 голосов
/ 16 августа 2011

В частности, мне нужно объявить (насколько я понимаю) 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 ++, как правильно справиться с этим?

1 Ответ

5 голосов
/ 16 августа 2011

Вам не нужно помещать их в namespace boost, вы можете поместить их в то же пространство имен, что и ваш class Outer, и они будут найдены с помощью поиска, зависящего от аргумента.

Каждый новый экземпляр intrusive_ptr увеличивает счетчик ссылок, используя неквалифицированный вызов функции intrusive_ptr_add_ref, передавая ему указатель в качестве аргумента.

...