我有一个boost::ptr_map
将抽象基类(例如VectorWrapperBase)存储为值,这允许我将字符串映射到不同类型的向量。
boost::ptr_map<std::string, VectorWrapperBase> memory_map;
//...
memory_map.insert(str_key, new VectorWrapper<T>());
这似乎有效。但是,当我memory_map
作为另一个类的成员并尝试将该类存储在 中时std::map
,编译失败。
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()));
最后一行失败:
/SOMEPATH/boost_1_48_0/boost/ptr_container/clone_allocator.hpp:34
error: cannot allocate an object of abstract type ‘xyz::VectorWrapperBase’
作为 C++ 的新手,这令人费解。
我怀疑错误是由于地图插入复制了AgentMemory
涉及克隆ptr_map
. 而且由于我的VectorWrapper
对象不可克隆,因此引发了错误。
我的问题是:
- 为什么我会收到错误消息?(我的怀疑是否接近实际发生的事情?)
- 我该如何解决这个问题?
为了解决编译错误,我考虑了以下内容,但没有太多 C++ 经验,无法决定哪个更合适:
- 删除纯说明符 (
= 0
) 所以VectorWrapperBase
不再是抽象的- 这感觉就像一个黑客,因为
VectorWrapperBase
不应该被实例化
- 这感觉就像一个黑客,因为
- 使 VectorWrappers 可克隆
- 这似乎可行,但在我的用例中,只有空容器被分配给顶级地图,因此内部的 VectorWrappers
ptr_map
永远不需要被克隆。因此,可克隆性只是为了安抚编译器而不反映实际使用情况。
- 这似乎可行,但在我的用例中,只有空容器被分配给顶级地图,因此内部的 VectorWrappers
- 忘记
ptr_map
并使用std::map
andshared_ptr
代替。- 我不太喜欢这个解决方案,因为我希望矢量包装器的生命周期与地图的生命周期相关联。我也有点担心(也许是不必要的?)
shared_ptr
在大量多线程应用程序中广泛使用的潜在开销。
- 我不太喜欢这个解决方案,因为我希望矢量包装器的生命周期与地图的生命周期相关联。我也有点担心(也许是不必要的?)