我遇到std::map
的问题。我尝试实现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)
^
可以选择这样做吗?
答案 0 :(得分:2)
当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
超出范围时,它将delete
该对象而不将其从map
。也许你计划照顾它,但如果这是偶然的,你可能想要在shared_ptr
中存储map
来防止这种情况发生,或者你可能想要it->second
作为原始指针,不将其存储在shared_ptr
。