我需要修复我的旧项目中的一些错误,我认为这是重构某些代码的绝佳时机。
我有以下结构的地图:
std::map< std::string, std::map<std::string, myClass*> > ComponentMap;
我需要在某些地方迭代一些底层子图,并且使用了以下内容:
for (std::map<std::string, myClass* >::iterator iter = ComponentMap[compNameString].begin(); iter != ComponentMap[compNameString].end(); ++iter)
{
//some code
if (IsComponentOfType(iter, sCOMP_PRINCIPAL))
iter->second->GetComponentValue(date, compName, 00);
//some more code
}
IsComponentOfType函数具有以下声明:
bool IsComponentOfType(const std::map<std::string, myClass* >::iterator & MapIter, const sCOMPONENT_TYPE & Type)
我的问题是: 当我这样重写for循环时:
for (auto const& iter: ComponentMap[compNameString])
我收到以下编译错误:
IsComponentOfType(const std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>> &,const sCOMPONENT_TYPE &)': cannot convert argument 1 from 'const std::pair<const _Kty,_Ty>' to 'const std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>> &'
为了“使” c ++ 11语法起作用,我需要重写哪种类型的函数参数?
答案 0 :(得分:1)
使用
std::map< std::string, std::map<std::string, myClass*> > ComponentMap;
和
for (auto const& iter: ComponentMap[compNameString]) {}
iter
的类型将被推论为std::map<std::string, myClass*>::value_type const&
,等于std::pair<std::string const, myClass*> const&
。
使用range-based for
loop获得的是 不是 迭代器,它是一个值。每个值都对应于您循环经过的容器中的一个元素。
答案 1 :(得分:1)
C ++ 11 for循环在元素上循环。
备份并返回工作循环代码。然后在循环的顶部添加行auto const& elem=*iter;
。
接下来,逐行删除循环正文中的iter
。更改每一行后,请确保代码可以编译并运行。
if (IsComponentOfType(iter,
将此更改为
if (IsComponentOfType(elem,
使用C ++ 03代码进行编译(将IsComponentOfType
修改为std::pair<std::string const, myClass*> const&
)。
iter->second
将此更改为
elem.second
完成此操作后(和其他地方类似),将循环更改为C ++ 11样式:
for (auto const& elem: ComponentMap[compNameString])
完成。
答案 2 :(得分:1)
attr(optional) for ( range_declaration : range_expression ) loop_statement
range_declaration-一个命名变量的声明,其类型是range_expression表示的序列元素的类型,或对该类型的引用。通常将自动说明符用于自动类型推导。
由于iter
是一个值,
代替:
iter->second->GetComponentValue(date, compName, 00);
这应该有效:
iter.second->GetComponentValue(date, compName, 00);