std::map
有问题。我尝试实现映射类型应该返回指向新创建对象的指针的映射。在下面的代码中有更好的解释:
std::map<char, abstract_operation_factory*> operations_map = boost::assign::map_list_of
('+', (new add_oper_factory))
('-', (new sub_oper_factory));
char operation = '+';
std::map<char, abstract_operation_factory*>::const_iterator it = operations_map.find(operation);
if (it != operations_map.end()) {
boost::shared_ptr<abstract_operation_factory> oper_factory(it->second);
}
我总是从 boost 库中得到同样的错误。
/boost/preprocessor/iteration/detail/local.hpp:37: error: no matching function for call to 'std::pair<char, add_oper_factory*>::pair(const char&, sub_oper_factory* const&)'
BOOST_PP_LOCAL_MACRO(1)
^
有任何选择吗?
最佳答案
当 map_list_of
看到这个列表时...
('+', (new add_oper_factory))
('-', (new sub_oper_factory))
...它开始根据第一对的类型创建对,但随后与第二对的类型发生冲突。如果您将两个指针都指向 abstract_operation_factory*
,您将通过:
('+', static_cast<abstract_operation_factory*>(new add_oper_factory))
('-', static_cast<abstract_operation_factory*>(new sub_oper_factory))
也就是说,当您稍后创建...
boost::shared_ptr<abstract_operation_factory> oper_factory(it->second);
...您要求 shared_ptr
取得动态分配对象的所有权 - 当 shared_ptr
超出范围时,它将删除
对象而不将其从 map
中删除。也许你打算处理这个问题,但如果这是偶然的,你可能想将 shared_ptr
存储在 map
中以防止这种情况发生,或者你可能想使用 it->second
作为原始指针而不将其存储在 shared_ptr
中。
关于c++ - 如何在 std::map 中使用 new 运算符作为映射类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25442576/