将boost :: intrusive_ptr与嵌套类一起使用

trb*_*abb 4 c++ boost namespaces smart-pointers nested-class

具体来说,我需要声明(据我所知)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++;
    }

};
Run Code Online (Sandbox Code Playgroud)

我无法找到正确的语法来进行编译并保持我想要的访问权限.我的主要问题是gcc似乎很不高兴"boost :: intrusive_ptr_release(Outer :: Inner*p)应该在名称空间提升中声明".

我从这个例子中看到,intrusive_ptr帮助器是在命名空间boost中向前声明的 - 但我无法转发声明它们,因为据我所知,嵌套类(即"内部",这些函数引用的)只能是他们的外部类中向前声明,这也是朋友声明必须去的地方.

更大的C++大师,处理这个问题的正确方法是什么?

ybu*_*ill 5

您不必将它们放入namespace boost,您可以将它们放在与您相同的命名空间中,class Outer并且可以通过参数依赖查找找到它们.

每个新的intrusive_ptr实例通过使用对函数intrusive_ptr_add_ref 的非限定调用来递增引用计数,并将指针作为参数传递给它.