У меня проблема с 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
выходит из области действия, он delete
объект, не удаляя его с map
. Возможно, вы планируете позаботиться об этом, но если это случайно, вы можете захотеть вместо этого сохранить shared_ptr
на map
чтобы предотвратить это, или вы можете использовать it->second
как необработанный указатель, не сохраняя его в shared_ptr
.