代码之家  ›  专栏  ›  技术社区  ›  Raindog

C++ 0x和FooRe::

  •  1
  • Raindog  · 技术社区  · 14 年前

    如果我有一个私有结构的类,使用 boost::make_shared() 构造 shared_ptr 在该类的成员函数中,将使用GCC4.6发出编译器错误。

    #include "boost/shared_ptr.hpp"
    #include "boost/make_shared.hpp"
    
    class Foo
    {
    private:
        Foo(int a){};
    public:
        static boost::shared_ptr<Foo> do_foo(){ return boost::make_shared<Foo>(5); }
        friend template boost::shared_ptr<Foo> boost::make_shared<Foo>( Arg1 && arg1, Args && ... args );
    }
    
    int main()
    {
        auto f = Foo::do_foo();
    }
    

    Foo::do_foo 将导致编译器错误。

    有什么想法吗?

    2 回复  |  直到 5 年前
        1
  •  3
  •   Anthony Williams    14 年前

    不幸的是,没有指定哪个函数实际调用中的构造函数 make_shared ,因此不能将该函数作为朋友。如果有一个类具有这样的私有构造函数,那么就不能使用 使您共享 .

    class Foo
    {
    private:  
        Foo(int a){};  
    public:  
        static boost::shared_ptr do_foo();
        friend class DerivedFoo;
    };
    
    class DerivedFoo: public Foo
    {
    public:
        DerivedFoo(int a):
            Foo(a)
        {}
    };
    
    boost::shared_ptr<Foo> Foo::do_foo(){ return boost::make_shared<DerivedFoo>(5); }
    

    DerivedFoo do_foo Foo 直接,用户将无法判断他们所拥有的实际上是一个 .

        2
  •  0
  •   kenm    14 年前

    class Foo  
    {  
    private:  
        Foo(int a){};  
    public:  
        static boost::shared_ptr<Foo> do_foo(){ return boost::make_shared<Foo>(5); }
        friend template boost::shared_ptr<Foo> boost::make_shared<Foo>( Arg1 && arg1, Args && ... args );
    }