2010-04-13 6 views
8
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; 
    } 
} 

El siguiente mensaje de error proviene de GCC en la segunda BOOST_FOREACHpor qué BOOST_FOREACH no puede manejar const boost :: ptr_map?

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 

Creo que esta es la debilidad de ref_pair del contenedor puntero ...

Respuesta

5

Basado en this answer, parece que 'estas en lo correcto. Pero hay una solución. Cambie su segundo ciclo a este:

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

Typedefing también es confuso al usar mapas. Es mucho más simple (y mucho más legible) usar una tupla en su lugar. He aquí cómo usted puede utilizar una tupla:

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

Además, puede dar nombres más significativos en lugar de value.first y value.second.

+0

Me gustó esto hasta que fui a ver la biblioteca para obtener más información ... '" Los niveles son tuplas, donde todos los elementos son de tipos de referencia no constantes. 'La pregunta es específicamente sobre las referencias' const'. – Dennis

+0

Aún funcionará con los mapas de const. La referencia no const está ligada a las variables locales y no a los elementos del mapa. –

+0

lo verá de nuevo. Aclamaciones. – Dennis

Cuestiones relacionadas