抽象基本クラス(たとえばVectorWrapperBase)を値として格納するboost::ptr_map
があります。これにより、文字列を異なる型のベクトルにマップすることができます。抽象基本クラスのptr_mapを含むマッピングオブジェクト
boost::ptr_map<std::string, VectorWrapperBase> memory_map;
//...
memory_map.insert(str_key, new VectorWrapper<T>());
これは動作するようです。しかし、別のクラスのメンバとしてmemory_map
があり、そのクラスをstd::map
に格納しようとすると、コンパイルは失敗します。
/SOMEPATH/boost_1_48_0/boost/ptr_container/clone_allocator.hpp:34
error: cannot allocate an object of abstract type ‘xyz::VectorWrapperBase’
C++に新なので、これは不可解です:
class AgentMemory {
//...
private:
boost::ptr_map<std::string, VectorWrapperBase> memory_map;
};
std::map<std::string, AgentMemory> agent_map;
//...
agent_map.insert(std::pair<std::string, AgentMemory>(agent_name, AgentMemory()));
最後の行がで失敗します。
I エラーがptr_map
をクローニングすることを含むAgentMemory
オブジェクトをコピーマップ挿入にダウンしている疑いのある。私のVectorWrapper
オブジェクトはcloneableではないので、エラーが発生します。
私の質問は以下のとおりです。
- は、なぜ私はエラーを取得していますか? (私の疑惑は実際に起こっていることに近いですか)
- 私はこれにどのように対処しますか?
コンパイルエラーに対処するため、私は次のよう考えられてきましたが、C++での多くの経験することなく、より適切であるかを決めることはできません。
- 純粋指定子(
= 0
)を取り外しのでVectorWrapperBase
ですもはやVectorWrapperBase
が - をインスタンス化すべきではありませんので、これはハックのように感じている
-
-
抽象VectorWrappersを作ります
cloneable
- This seems to workですが、空のコンテナのみがトップレベルのマップに割り当てられているため、
ptr_map
内のVectorWrappersを決して複製する必要はありません。したがって、クローン性は、コンパイラを和らげるためだけに存在し、実際の使用を反映しません。 ptr_map
を忘れて、std::map
とshared_ptr
代わりに使用します。- 私はベクトルラッパーの寿命をマップの寿命に近づけたいと思っているので、この解決策に熱心ではありません。また、多量のマルチスレッドアプリケーションでの
shared_ptr
の広範な使用の潜在的なオーバーヘッドについて少し気になります(恐らく不必要にそうです)。
- 私はベクトルラッパーの寿命をマップの寿命に近づけたいと思っているので、この解決策に熱心ではありません。また、多量のマルチスレッドアプリケーションでの
- This seems to workですが、空のコンテナのみがトップレベルのマップに割り当てられているため、
抽象基本クラスに仮想デストラクタがありますか? – TemplateRex
はい、あります。 .. –