为什么BOOST_FOREACH无法处理const boost :: ptr_map?

时间:2010-04-13 13:50:26

标签: c++ boost foreach

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 个答案:

答案 0 :(得分:5)

基于this answer,看起来你是对的。但有一个解决方法。将第二个循环更改为:

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

答案 1 :(得分:1)

使用地图时,Typedefing也会让人感到困惑。使用元组代替它更简单(也更易读)。以下是使用元组的方法:

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

另外,您可以提供更有意义的名称,而不是value.firstvalue.second