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

标签 c++ boost stdmap

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/

相关文章:

c++ - std::string 插入方法有不明确的重载?

c++ - boost::subgraph 如何工作?我们可以使用过滤图吗?

c++ - 与一组其他线程共享一个线程生成的数据

c++ - boost asio 服务器在关闭 boost::socket 的调用中挂起

c++ - 如何访问成对元素的映射?

C++:在不知道 key 的情况下插入 std::map

c++ - [[除了属性外还有什么 'alternate grammar'?

c++ - C++中的部分前向声明

c++ - 如何在C++中调试

c++ - std::map - 在项目删除后重新排序映射值