почему BOOST_FOREACH не может обработать const boost :: ptr_map? - PullRequest
8 голосов
/ 13 апреля 2010
void main()
{
  typedef boost::ptr_map<int, char>  MyMap;
  //typedef std::map<int, char *>  MyMap;  // in contrast with std type it works

  MyMap mymap;

  mymap[1] = new char('a');
  mymap[2] = new char('b');
  mymap[3] = new char('c');

  BOOST_FOREACH(MyMap::value_type value, mymap)
  {
    std::cout << value.first << "  " << value.second << std::endl;
  }

  MyMap const & const_mymap = mymap;

  BOOST_FOREACH(const MyMap::value_type value, const_mymap)
  {
    std::cout << value.first << "  " << value.second << std::endl;
  }
}

Следующее сообщение об ошибке исходит от GCC во втором BOOST_FOREACH

error: conversion from 'boost::ptr_container_detail::ref_pair<int, const char* const>' to non-scalar type 'boost::ptr_container_detail::ref_pair<int, char* const>' requested

Я считаю, что это слабость ref_pair контейнера указателя ...

Ответы [ 2 ]

5 голосов
/ 13 апреля 2010

Исходя из этого ответа , похоже, что вы правы. Но есть обходной путь. Измените свой второй цикл на это:

BOOST_FOREACH(MyMap::const_iterator::value_type value, const_mymap)
{
    std::cout << value.first << "  " << value.second << std::endl;
}
1 голос
/ 24 января 2012

Определение типа также сбивает с толку при использовании карт. Гораздо проще (и гораздо более читабельно) использовать вместо этого кортеж. Вот как вы можете использовать кортеж:

int key;
char* value;
BOOST_FOREACH(boost::tie(key, value), mymap)
{
  std::cout << key << "  " << value << std::endl;
}

Кроме того, вы можете дать более значимые имена вместо value.first и value.second.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...