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);
}
好的,所以我正在构建一个游戏,要求我能够添加和删除 *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);
}