我有以下代码:
void endConditionalFlowsBetweenSets(const list<unsigned int>& sourceSet, const list<unsigned int>& endSet){
//TODO: Optimize
//ending previous flows between the two sets
list<unsigned int>::iterator itS;
list<unsigned int>::iterator itE;
for(itS=sourceSet.begin();itS!=sourceSet.end();itS++)
for(itE=endSet.begin();itE!=endSet.end();itE++)
if(*itS!=*itE && linkIndex[*itS][*itE].index==-1)
endFlow(*itS,*itE);
}
编译后我收到错误:no known conversion for argument 1 from ‘std::list<unsigned int>::const_iterator {aka std::_List_const_iterator<unsigned int>}’ to ‘const std::_List_iterator<unsigned int>&’
为什么?我只是通过引用传递一个列表并创建一个迭代器来迭代它。
答案 0 :(得分:5)
您应该使用const_iterator
:
list<unsigned int>::const_iterator itS;
list<unsigned int>::const_iterator itE;
答案 1 :(得分:2)
我只是通过引用传递列表
不,你是通过const引用传递的。您的参数和迭代器之间存在const
不匹配。
更改功能签名:
void endConditionalFlowsBetweenSets(
list<unsigned int>& sourceSet,
list<unsigned int>& endSet);
或更改迭代器decarations:
list<unsigned int>::const_iterator itS;
list<unsigned int>::const_iterator itE;
答案 2 :(得分:1)
您的列表sourceSet
是const,但您正在尝试创建非const迭代器。如果你可以这样做,你就可以修改列表,这是不好的,因为列表是const
。
这就是你应该使用list<unsigned int>::const_iterator
。
答案 3 :(得分:0)
您需要使用const_iterator
:
list<unsigned int>::const_iterator itS;
list<unsigned int>::const_iterator itE;
您正在sourceSet
传递const
,因此您无法使用非const
迭代器。
答案 4 :(得分:0)
如果您只使用auto
并让编译器找到合适的类型,那么整个问题永远不会发生:
for(auto itS=sourceSet.begin(); itS!=sourceSet.end(); itS++)
for(auto itE=endSet.begin(); itE!=endSet.end(); itE++)
if(*itS!=*itE && linkIndex[*itS][*itE].index==-1)
endFlow(*itS,*itE);
您也可以考虑循环范围
for(auto src : sourceSet) // src is unsigned int
for(auto&end : endSet) // end is unsigned int& allows manipulation in endFlow
if(src != end && linkIndex[src][end].index==-1)
endFlow(src,end);