11 votes

pas de fonction membre correspondante pour l'appel à 'effacer'.

Voici le code qui provoque l'erreur :

Usine.h :

#include <string>
#include <map>

namespace BaseSubsystems
{
    template <class T>
    class CFactory
    {
    protected:
        typedef T (*FunctionPointer)();
        typedef std::pair<std::string,FunctionPointer> TStringFunctionPointerPair;
        typedef std::map<std::string,FunctionPointer> TFunctionPointerMap;
        TFunctionPointerMap _table;
    public:
        CFactory () {}
        virtual ~CFactory();
    }; // class CFactory

    template <class T> 
    inline CFactory<T>::~CFactory()
    {
        TFunctionPointerMap::const_iterator it = _table.begin();
        TFunctionPointerMap::const_iterator it2;

        while( it != _table.end() )
        {
            it2 = it;
            it++;
            _table.erase(it2);
        }

    } // ~CFactory
}

Et l'erreur que je reçois :

error: no matching member function for call to 'erase' [3]
                         _table.erase(it2);
                         ~~~~~~~^~~~~

Des conseils ? Merci.

7voto

R. Martinho Fernandes Points 96873

Voici la signature de map::erase en C++98 :

void erase( iterator position );

Cette fonction prend un iterator mais vous passez un const_iterator . C'est pourquoi le code ne compile pas.

Comment puis-je réparer cela ?

En C++11, ce n'est même pas un problème, il n'est donc pas nécessaire de le corriger. C'est parce qu'en C++11, la fonction map::erase a la signature suivante, et accepte donc une fonction const_iterator .

iterator erase( const_iterator position );

Si vous ne pouvez pas utiliser la nouvelle norme, vous devrez changer vos variables en iterator à la place.

3voto

Kyle Lutz Points 4792

Vous passez un const_iterator à une méthode qui attend un simple itérateur.

Voir : http://www.cplusplus.com/reference/stl/map/erase/

2voto

Rohit Points 2629

Voyez ce que dit le maître :

Scot Meyers dans STL efficace

Point 26. Préférer iterator à const iterator, reverse_iterator et const_reverse_iterator. Bien que les conteneurs supportent quatre types d'itérateurs, l'un de ces types a des privilèges que les autres n'ont pas. Ce type est iterator, iterator est spécial.

typedef deque<int> IntDeque; //STL container and
typedef lntDeque::iterator Iter; // iterator types are easier
typedef lntDeque::const_iterator ConstIter; // to work with if you
// use some typedefs
Iter i;
ConstIter ci;
… //make i and ci point into
// the same container
if (i == ci ) ... //compare an iterator
// and a const_iterator

Point 27. Utilisez la distance et l'avance pour convertir les const_iterators d'un conteneur en itérateurs.

typedef deque<int> IntDeque; //convenience typedefs
typedef lntDeque::iterator Iter;
typedef lntDeque::const_iterator ConstIter;
ConstIter ci; // ci is a const_iterator
…
Iter i(ci); // error! no implicit conversion from
// const_iterator to iterator
Iter i(const_cast<Iter>(ci)); // still an error! can't cast a
// const_iterator to an iterator

Ce qui fonctionne, c'est l'avance et la distance

typedef deque<int> IntDeque; //as before
typedef IntDeque::iterator Iter;
typedef IntDeque::const_iterator ConstIter;
IntDeque d;
ConstIter ci;
… // make ci point into d
Iter i(d.begin()); // initialize i to d.begin()
Advance(i, distance(i, ci)) //move i up to where ci is
// (but see below for why this must
// be tweaked before it will compile)

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