2010-06-07 64 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:初始化:不能从 '的std ::对< _Ty1,_Ty2>' 转换为 'lp_type &'升压每个问题

时,我有','在元素类型中,boost doc说我可以使用typedef或者预定义var; 但我想要获得参考时该怎么办?

+0

你打算修改'row'吗? – kennytm 2010-06-07 14:29:48

回答

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'会更好,因为它不会暴露这种复杂性。 – 2010-06-07 14:36:58

+0

@Matthieu:是的;三个人说,当我编辑时加入这个建议。 :-我全心全意同意。 – 2010-06-07 14:39:58

1

我觉得詹姆斯McNellis是正确的。我会添加一个建议,即利用std :: map提供的value_type typedef。然后你的代码可能看起来像这样:

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

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

}