Home > Net >  C No matching member function for call to 'erase'?
C No matching member function for call to 'erase'?

Time:01-27

Alright, so I am building a game that requires that I am able to add and remove a *Fighter object.

I first declare member variable fighter here

std::vector<Fighter*> fighter;

I then implement Add and Remove like this:

void Game::AddFighter(Fighter* f) {

    fighter.push_back(f);
}

void Game::RemoveFighter(Fighter* f) {


    if ( std::find(fighter.begin(), fighter.end(), f) != fighter.end() )
    {
        fighter.erase(f); //Error here
    }

}

On the line indicated above, Im getting the error

No matching member function for call to 'erase'

I understand that the member calling erase must be an iterator, however I don't know how to do that in the context of what I am trying to achieve. I know that the above code works for detecting a Fighter* if the Fighter* has been added - how do I use the erase() function?

CodePudding user response:

You need take the iterator returned by std::find() and pass it to vector::erase(), eg:

void Game::RemoveFighter(Fighter* f) {
    auto iter = std::find(fighter.begin(), fighter.end(), f);
    if ( iter != fighter.end() ) {
        fighter.erase(iter);
    }
}

Alternatively:

void Game::RemoveFighter(Fighter* f) {
    decltype(fighter)::iterator iter;
    if ( (iter = std::find(fighter.begin(), fighter.end(), f)) != fighter.end() ) {
        fighter.erase(iter);
    }
}

Which can be re-written as this in C 17 or later:

void Game::RemoveFighter(Fighter* f) {
    if ( auto iter = std::find(fighter.begin(), fighter.end(), f); iter != fighter.end() ) {
        fighter.erase(iter);
    }
}

Alternatively, if you are using C 20 or later, you can use std::erase() instead:

void Game::RemoveFighter(Fighter* f) {
    std::erase(fighter, f);
}

CodePudding user response:

You need to pass an iterator to erase:

    if ( auto it = std::find(fighter.begin(), fighter.end(), f); it != fighter.end() )
    {
        fighter.erase(it); //No error here. If you use C  17.
    }
  •  Tags:  
  • Related