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;
}

しかし、最後はそれほど重要ではありません。重要なこと - 関数 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>

では、どうすれば返品できるようになります... 返品可能 // どのように受け取るのですか?

4

2 に答える 2

21

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

于 2011-04-19T23:59:22.030 に答える
5

また、boost::interprocess::unique_ptr を試すこともできます。

于 2011-04-20T02:09:34.847 に答える