代码之家  ›  专栏  ›  技术社区  ›  psaghelyi

为什么boost_foreach不能处理const boost::ptr_map?

  •  8
  • psaghelyi  · 技术社区  · 15 年前
    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;
      }
    }
    

    以下错误消息来自第二个boost foreach的gcc

    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对的弱点…

    2 回复  |  直到 13 年前
        1
  •  5
  •   Community CDub    8 年前

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

    BOOST_FOREACH(MyMap::const_iterator::value_type value, const_mymap)
    {
        std::cout << value.first << "  " << value.second << std::endl;
    }
    
        2
  •  1
  •   Paul Fultz II    13 年前

    在使用映射时,typedefing也很混乱。用元组代替元组要简单得多(可读性也强得多)。下面是如何使用元组:

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

    另外,你可以给出更有意义的名字而不是 value.first value.second .