2 votes

C++ Passer toute la liste par référence

J'ai le morceau de code suivant :

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);
}

Lors de la compilation, j'obtiens l'erreur suivante : 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>&’

Comment cela se fait-il ? Je passe simplement une liste par référence et je crée un itérateur pour la parcourir.

5voto

taocp Points 14822

Vous devez utiliser const_iterator :

 list<unsigned int>::const_iterator itS;
 list<unsigned int>::const_iterator itE;

2voto

Robᵩ Points 50501

Je passe simplement une liste par référence

Non, vous le passez par une référence constante. Vous avez un const inadéquation entre vos paramètres et vos itérateurs.

Soit modifier la signature de la fonction :

void endConditionalFlowsBetweenSets(
    list<unsigned int>& sourceSet,
    list<unsigned int>& endSet);

ou de modifier les délcarations de l'itérateur :

 list<unsigned int>::const_iterator itS;
 list<unsigned int>::const_iterator itE;

1voto

kirelagin Points 5717

Votre liste sourceSet est const, mais vous essayez de créer des itérateurs non const. Si vous pouviez le faire, vous seriez capable de modifier la liste, ce qui n'est pas bon puisque la liste est const .

C'est pourquoi vous devez utiliser list<unsigned int>::const_iterator .

0voto

Shafik Yaghmour Points 42198

Vous devez utiliser const_iterator :

list<unsigned int>::const_iterator itS;
list<unsigned int>::const_iterator itE;

y sourceSet como const Vous ne pouvez donc pas utiliser de produits qui ne sont pas des const itérateurs.

0voto

Walter Points 7554

Ce problème n'aurait jamais eu lieu si vous aviez simplement utilisé auto et laisser le compilateur trouver les types appropriés :

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);

Vous pouvez également envisager l'utilisation de la boucle for

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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X