C++ C++;0x和Friend函数以及boost::使_共享

C++ C++;0x和Friend函数以及boost::使_共享,c++,c++11,shared-ptr,friend,make-shared,C++,C++11,Shared Ptr,Friend,Make Shared,如果我有一个具有私有构造的类,使用boost::make_shared()从该类的成员函数中构造该类的shared_ptr,将使用gcc 4.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()
从该类的成员函数中构造该类的
shared_ptr
,将使用gcc 4.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();
}
#包括“boost/shared#ptr.hpp”
#包括“boost/make_shared.hpp”
福班
{
私人:
Foo(int a){};
公众:
静态boost::shared_ptr do_foo(){return boost::make_shared(5);}
好友模板boost::shared_ptr boost::make_shared(Arg1&&Arg1,Args&&Args);
}
int main()
{
自动f=Foo::do_Foo();
}
调用
Foo::do_Foo
将导致编译器错误


有什么想法吗?

您至少需要在一些地方提供模板参数

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 );
}  
class-Foo
{  
私人:
Foo(int a){};
公众:
静态boost::shared_ptr do_foo(){return boost::make_shared(5);}
好友模板boost::shared_ptr boost::make_shared(Arg1&&Arg1,Args&&Args);
}  

不幸的是,在
make_shared
中没有指定实际调用构造函数的函数,因此不能将该函数设为好友。如果您有一个类具有这样的私有构造函数,那么您就无法使用
make_shared
构造实例

但是,您可以使用调用相应基类构造函数的公共构造函数创建一个派生类,并使该派生类成为朋友(以便它可以调用私有构造函数):

class-Foo
{
私人:
Foo(int a){};
公众:
静态boost::shared_ptr do_foo();
朋友级的DerivedFoo;
};
派生类Foo:公共Foo
{
公众:
DerivedFoo(INTA):
傅(甲)
{}
};
boost::shared_ptr Foo::do_Foo(){return boost::make_shared(5);}

如果
DerivedFoo
位于.cpp文件中定义
do_foo
的匿名命名空间中,则其他.cpp文件中的函数仍无法直接构造
foo
的任何实例,用户将无法判断他们拥有的实际上是一个
DerivedFoo

@sellibitze可能不应该在那里,但我只是复制粘贴了OP的代码
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); }