2010-06-07 3 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){ 

} 

это не могут быть выполнены: ошибка C2440: «инициализации»: не удается преобразовать из «станд :: пары < _Ty1, _Ty2>» на «lp_type &»импульс для каждой задачи

, когда у меня есть ',' в типе элемента, boost doc говорит, что я могу использовать typedef или предопределять var; , но что мне делать, когда я хочу получить ссылку?

+0

Вы собираетесь изменить 'row'? – kennytm

ответ

10

Возможно, что ваш typedef неверен; это должно быть:

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

Ключевой элемент в карте карты является const-квалифицированным.

Было бы немного более чистым использовать value_type typedef; Таким образом, вы не повторяйте информацию о типе:

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

} 
+2

Хотя технически корректно, я бы сказал, что использование внутреннего typedef 'value_type' карты было бы лучше, поскольку оно не раскрывает эту сложность. –

+0

@Matthieu: Да; три человека сказали, что пока я редактировал, чтобы добавить это как предложение. : -P Я полностью согласен. –

1

Я думаю, что Джеймс McNellis прав. Я добавлю предложение, что вы используете typedef value_type, который предоставляет std :: map. Тогда ваш код может выглядеть так:

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

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

} 
Смежные вопросы