4

所以我尝试围绕 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;
}

但最后不是那么重要。重要的是 - 我无法让我的函数返回=(

我尝试这样的方式:

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>

那么如何让我的退货......可退货//如何接收它?

4

2 回答 2

21

boost::scoped_ptr是不可复制的。由于您不能复制 a scoped_ptr,因此您也不能返回一个(按值返回对象要求您能够复制它,至少在 C++03 中是这样)。如果需要返回智能指针拥有的对象,则需要选择不同类型的智能指针。

如果您的编译器支持std::unique_ptr,您应该使用它(因为看起来您使用的是 Visual C++,所以 Visual C++ 2010 支持std::unique_ptr);否则,请考虑使用std::auto_ptror {std,std::tr1,boost}::shared_ptr,具体取决于您的确切用例。

于 2011-04-19T23:59:22.030 回答
5

你也可以试试 boost::interprocess::unique_ptr。

于 2011-04-20T02:09:34.847 回答