2

私はのを持っている必要がありstd::vectorますboost::ptr_vector。管理を容易にするために、boost :: ptr_vectorをクラス(Zoo)で囲み、そのstd :: vector()を作成しましたallZoos。これを再現するための最小限のコードを見てください。

#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/utility.hpp>

class Animal
{
public:
    virtual char type() = 0;
};

class Cat : public Animal
{
public:
    char type() { return 1; }
};

class Zoo
{
public:
    boost::ptr_vector<Animal> animals;
};


int main()
{
    std::vector<Zoo> allZoos;

    Zoo ourCityZoo;
    ourCityZoo.animals.push_back(new Cat());

    //Uncommenting any of the lines below causes error:
    //allZoos.push_back(ourCityZoo);
    //allZoos.clear();

    return 0;
}

宣言allZoosは問題ありませんが、そのメンバー関数のいずれかを呼び出すと、コンパイラエラーが発生します:(完全なエラーログが長すぎて、投稿されませんでした)

C2259: 'Animal' : cannot instantiate abstract class c:\boost_1_49_0\boost\ptr_container\clone_allocator.hpp 34  1

これは、boostのコピー不可能なユーティリティクラスやカスタムnew_clone関数とは何の関係もなく、運が悪かったので試してみました。どうすればそれを解決できますか?

(私はVS2010を使用しています)

4

1 に答える 1

9

実際には、エラーが表示される場所を読み取ると役に立ちます。Boostソースには、明確かつ明確に記載されています。

template< class T >
inline T* new_clone( const T& r )
{
    //
    // @remark: if you get a compile-error here,
    //          it is most likely because you did not
    //          define new_clone( const T& ) in the namespace
    //          of T.
    //
    T* res = new T( r );
    BOOST_ASSERT( typeid(r) == typeid(*res) &&
                  "Default new_clone() sliced object!" );
    return res;
}

タイプのクローンを作成する方法を指定しない場合は、単にコピーするだけでクローンを作成しようとします。これは、抽象クラスでは不可能です。名前空間のと関数に適切なメソッドを追加すれば、問題ありませcloneん。abstract_classnew_clone

これがコードの修正バージョンです。

于 2012-03-10T09:10:18.720 に答える