Функции C ++ 0x и Friend и boost :: make_shared - PullRequest
1 голос
/ 09 сентября 2010

Если у меня есть класс с закрытой конструкцией, использование 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 do_foo(){ return boost::make_shared(5); }
    friend template boost::shared_ptr boost::make_shared( Arg1 && arg1, Args && ... args );
}  


int main()
{
    auto f = Foo::do_foo();
}

Вызов Foo::do_foo приведет к ошибке компилятора.

Есть мысли?

Отредактировано для включения скомпилированного кода.

Ответы [ 2 ]

3 голосов
/ 25 сентября 2010

К сожалению, не указано, какая функция на самом деле вызывает конструктор в 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.

0 голосов
/ 09 сентября 2010

Вам нужно, как минимум, предоставить аргументы шаблона в нескольких местах.

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 );
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...