如何在std :: map中使用new运算符作为映射类型?

时间:2014-08-22 08:20:41

标签: c++ boost stdmap

我遇到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)
         ^

可以选择这样做吗?

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