Почему я не могу вернуть Boost :: Scoped_ptr из функции? - PullRequest
4 голосов
/ 20 апреля 2011

Поэтому я пытаюсь создать оболочку для функций boost.extension для создания классов.Итак, я создал функцию:

template <class BaseClass, class ConstructorType>
 boost::scoped_ptr<BaseClass> get_class (shared_library & lib, std::string class_name, ConstructorType value ) {
map<string, factory<BaseClass, ConstructorType> > lib_factories = get_factories<BaseClass, ConstructorType>(lib);
return boost::scoped_ptr<BaseClass> lib_class(lib_factories[class_name].create(value));
}

, которая вызывает:

template <class BaseClass, class ConstructorType>
map<string, factory<BaseClass, ConstructorType> > get_factories (shared_library & lib) {
    type_map lib_types;
    if (!lib.call(lib_types)) {
        cerr << "Types map not found!" << endl;
        cin.get();
    }

    map<string, factory<BaseClass, ConstructorType> > lib_factories(lib_types.get());
    if (lib_factories.empty()) {
        cerr << "Producers not found!" << endl;
        cin.get();
    }
    return lib_factories;
}

, но последняя не так важна.Что важно - я не могу получить свою функцию return = (

Я пытаюсь таким образом:

boost::scoped_ptr<PublicProducerPrototype> producer = get_class<PublicProducerPrototype, int>(simple_producer, "simpleProducer", 1);

Я также пытался:

boost::scoped_ptr<PublicProducerPrototype> producer ( get_class<PublicProducerPrototype, int>(simple_producer, "simpleProducer", 1));

но компилятор зависаетмне C2248 он не может вызвать какого-то частного члена boost::scoped_ptr<T>

Так как сделать мой возврат ... возвратным // как его получить?

Ответы [ 2 ]

20 голосов
/ 20 апреля 2011

boost::scoped_ptr не подлежит копированию. Поскольку вы не можете скопировать scoped_ptr, вы также не можете его вернуть (возврат объекта по значению требует, чтобы вы могли сделать его копию, по крайней мере, в C ++ 03). Если вам нужно вернуть объект, принадлежащий интеллектуальному указателю, вам нужно выбрать другой тип интеллектуального указателя.

Если ваш компилятор поддерживает std::unique_ptr, вы должны использовать его вместо этого (поскольку похоже, что вы используете Visual C ++, Visual C ++ 2010 поддерживает std::unique_ptr); в противном случае рассмотрите возможность использования std::auto_ptr или {std,std::tr1,boost}::shared_ptr, в зависимости от того, какой у вас точный вариант использования.

5 голосов
/ 20 апреля 2011

Вы также можете попробовать boost :: interprocess :: unique_ptr.

...