C++ 没有匹配的成员函数来调用 'erase'?

C++ No matching member function for call to 'erase'?

好的,所以我正在构建一个游戏,要求我能够添加和删除 *Fighter 对象。

我这里先声明成员变量fighter

std::vector<Fighter*> fighter;

然后我像这样实现添加和删除:

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
    }

}

在上面指出的行中,我收到错误

No matching member function for call to 'erase'

我知道调用 erase 的成员必须是一个迭代器,但是我不知道如何在我想要实现的上下文中做到这一点。我知道如果添加了 Fighter*,上面的代码可以检测 Fighter* - 如何使用 erase() 函数?

您需要将迭代器传递给 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.
    }

你需要把std::find()返回的迭代器传给vector::erase(),例如:

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

或者:

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

在 C++17 或更高版本中可以是 re-written:

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

或者,如果您使用的是 C++20 或更高版本,则可以改用 std::erase()

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