私はのを持っている必要があり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を使用しています)