如果我有一个带有私有(private)构造的类,使用 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();
}
调用 Foo::do_foo
将导致编译器错误。
有什么想法吗?
最佳答案
遗憾的是,在make_shared
中没有指定哪个函数实际调用了构造函数,因此您不能将该函数设为友元。如果你有一个像这样的私有(private)构造函数的类,那么你就不能用 make_shared
构造一个实例。
但是,您可以做的是创建一个派生类,该派生类具有调用适当基类构造函数的公共(public)构造函数,并使该派生类成为 friend (因此它可以调用私有(private)构造函数):
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
的 .cpp 文件中的匿名命名空间中,则其他 .cpp 文件中的函数仍然无法构造 Foo
,用户将无法判断他们拥有的实际上是一个 DerivedFoo
。
关于C++0x 和 Friend 函数以及 boost::make_shared,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3672841/