1

プライベート構造のクラスがある場合、そのクラスのメンバー関数内からそのクラスのboost::make_shared()を構築するためにを使用すると、gcc4.6を使用してコンパイラエラーが発行されます。shared_ptr

#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、コンパイラエラーが発生します。

何かご意見は?

4

2 に答える 2

3

残念ながら、どの関数が実際にコンストラクターを呼び出すかは指定されていmake_sharedないため、その関数をフレンドにすることはできません。したがって、このようなプライベートコンストラクターを持つクラスがある場合、。を使用してインスタンスを構築することはできません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を定義する.cppファイルの匿名名前空間にある場合do_foo、他の.cppファイルの関数は、のインスタンスをFoo直接構築できず、ユーザーは、自分が持っているものが実際にであると判断できませんDerivedFoo

于 2010-09-24T21:55:39.323 に答える
0

少なくとも、いくつかの場所でテンプレート引数を提供する必要があります。

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 );
}  
于 2010-09-09T00:10:46.633 に答える