我有一个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
对象不是cloneable,因此会出现错误。
我的问题是:
为了解决编译错误,我考虑过以下内容,但没有太多C ++经验无法确定哪个更合适:
= 0
),使VectorWrapperBase
不再是抽象的
VectorWrapperBase
永远不应该被实例化ptr_map
内的VectorWrappers不需要克隆。因此,克隆性只是为了安抚编译器而不反映实际用法。ptr_map
并改为使用std::map
和shared_ptr
。
shared_ptr
的潜在开销,我也有点担心(可能是不必要的?)。答案 0 :(得分:0)
声明
agent_map.insert(std::pair<std::string, AgentMemory>(agent_name, AgentMemory()));
将调用AgentMemory
的默认构造函数,后者将调用boost::ptr_map<std::string, VectorWrapperBase>
的默认构造函数,它将尝试为抽象基类VectorWrapperBase
调用不存在的构造函数
因此,您必须确保包装或继承VectorWrapperBase
的每个类型的构造函数都应该始终构造一个具体的派生类。在您的情况下,选项3(派生类的共享指针映射)可能是明智的,但这取决于代码的较大上下文。