Почему я не могу вернуть Boost::Scoped_ptr из функции?

#c #boost #smart-pointers #scoped-ptr

#c #boost #интеллектуальные указатели #scoped-ptr

Вопрос:

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

 template <class BaseClass, class ConstructorType>
 boost::scoped_ptr<BaseClass> get_class (shared_library amp; 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 amp; 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;
}
  

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

Я пробую такой способ :

 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>

Итак, как сделать мой возврат… возвращаемый // как его получить?

Комментарии:

1. Я предполагаю, не зная больше об ошибке, что конструктор копирования является закрытым (т. Е. класс предназначен для того, чтобы его нельзя было копировать), и для возврата требуется создание копии. Вероятно, вы не используете правильный интеллектуальный указатель для работы.

Ответ №1:

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 , в зависимости от вашего конкретного варианта использования.

Комментарии:

1. Если вы используете auto_ptr (который в основном просто сломан unique_ptr ), имейте в виду его проблемы — в основном, то, что он несовместим с контейнерами STL, такими как vector и map . Лично я бы рекомендовал shared_ptr (который является частью boost )

2. Вы можете использовать boost::shared_ptr или std::auto_ptr .

Ответ №2:

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