Как использовать новый оператор в качестве отображаемого типа в std :: map?

0

У меня проблема с 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)
         ^

Есть ли какой-либо вариант для этого?

Теги:
boost
stdmap

1 ответ

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.

  • 0
    Вы определенно правы. Так что теперь, когда я буду использовать shared_ptr в карте таким образом: std :: map <char, boost :: shared_ptr <abstract_operation_factory>> operations_map = boost :: assign :: map_list_of ('+', static_cast <abstract_operation_factory *> (новая add_oper_factory)) ('-', static_cast <abstract_operation_factory *> (новая sub_oper_factory)); счетчик ссылок будет увеличиваться во время присваивания в boost :: shared_ptr <abstract_operation_factory> oper_factory = it-> second; и все будет хорошо, верно?
  • 0
    @Nowax: да, это звучит твердо для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню