2010-06-07 5 views
2
std::map< std::string , std::string > matrix_int; 
typedef std::pair< std::string , std::string > lp_type; 
BOOST_FOREACH(lp_type &row, matrix_int){ 

} 

cela ne peut pas être respecté: erreur C2440: 'initialisation': ne peut pas convertir 'std :: pair < _Ty1, _Ty2>' à 'lp_type &'coup de pouce pour chaque problème

quand j'ai ',' dans le type d'élément, boost doc dit que je peux utiliser typedef ou prédéfinir un var; mais que dois-je faire lorsque je veux obtenir une référence?

+0

Allez-vous modifier 'row'? – kennytm

Répondre

10

Votre erreur typedef est incorrecte; il doit être:

typedef std::pair< const std::string , std::string > lp_type; 
       ^note the added const 

L'élément clé de la paire de cartes est const-qualifié.

Il serait un peu plus propre d'utiliser le value_type typedef; De cette façon, vous ne répétez pas les informations de type:

typedef std::map<std::string, std::string> map_t; 
map_t matrix_int; 
BOOST_FOREACH(map_t::value_type& row, matrix_int){ 

} 
+2

Bien que techniquement correct, je dirais que l'utilisation de la typedef interne 'value_type' de la carte serait meilleure, car elle n'expose pas cette complexité. –

+0

@Matthieu: Oui; trois personnes ont dit que pendant que je rédigeais pour ajouter cela comme suggestion. :-P Je suis entièrement d'accord. –

1

Je pense que James McNellis a raison. Je vais ajouter la suggestion que vous profitiez du typedefichier value_type fourni par std :: map. Alors votre code pourrait ressembler à ceci:

typedef std::map< std::string , std::string > MyMap; 
MyMap matrix_int; 

BOOST_FOREACH(MyMap::value_type &row, matrix_int){ 

} 
Questions connexes