【问题标题】:std::remove causes compile errorstd::remove 导致编译错误
【发布时间】:2013-02-01 22:40:33
【问题描述】:

我正在尝试使用 question 的答案并得到奇怪的错误 -

/usr/include/c++/4.6/bits/stl_algo.h:162:错误:'__first.__gnu_cxx::__normal_iterator<_iterator _container>::operator* 中的 'operator==' 与 _Iterator = 不匹配用户*, _Container = std::vector, __gnu_cxx::__normal_iterator<_iterator _container>::reference = User& == __val'

我使用的是 Linux(Ubuntu 64 位),这可能是个问题。 提前致谢。

更新: 我使用 remove() 的代码:

myVec.erase(std::remove(myVec.begin(), myVec.end(), vecMember), myVec.end());

【问题讨论】:

  • 你能发布一个重现错误的小代码示例吗?

标签: c++ linux vector std stl-algorithm


【解决方案1】:

std::remove 调用operator==,你需要为你的User type重载它:

假设您按名称比较用户:

bool operator==(const User& lhs, const User& rhs)
{
   return lhs.name == rhs.name;
}

如果您仔细阅读,编译器消息会告诉您究竟缺少什么。

如果您使用 C++11,也可以将 std::remove_if 与 lambda 一起使用

myVec.erase(std::remove(myVec.begin(), myVec.end(), 
            [](const User& u){ return u.name == "name"; }), vec.end());

【讨论】:

  • 或者使用remove_if
  • 如果你想使用 lambdas,别忘了使用-std=c++0x(OP 使用的是 g++ 4.6)。