0

がありstd::deque<CustomType>、場所がわからないメンバーを削除しようとしています。したがって、私は最初にそれを見つけてから削除しています。

/* 
  Remove from - members, which is the private variable of std::deque<User> type
*/
void Group::remove_member(User u) {  
    if(this->is_member(u)) {
           std::deque<User>::iterator iter;
           iter = std::find(this->members.begin(), this->members.end(), u);
           if(iter != this->members.end()) {
                this->members.erase(iter);
           }
     }
}

ただし、コンパイラ (GCC) は、Operator Overloading が欠落しているように見えるエラーをスローしています。

In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/algorithm:62,
from Group.cpp:4:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h: In function ‘_RandomAccessIterator std::__find(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIterator = std::_Deque_iterator<User, User&, User*>, _Tp = User]’:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:4224:   instantiated from ‘_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = std::_Deque_iterator<User, User&, User*>, _Tp = User]’
Group.cpp:36:   instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:174: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:178: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:182: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:186: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:194: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:198: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:202: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
4

2 に答える 2

3

私のコメントを参照してください。

宣言してない気がするbool User::operator==(const User&)

*iterator == ...エラーは、 の実装内で実行しようとしていることを示していますstd::find。ただし、問題は、 をオーバーロードしていないことoperator==ですUser。次のように内部でメンバー関数を宣言してみてくださいUser...

bool operator==(const User&);

次に、 s間に意味のある意味的な同等性を提供するように定義します。Userそうstd::findしないと、それらを比較する方法がわかりません。


補足として、なぜ ではなくをGroup::remove_member使用しないのですか?const User&User

于 2012-09-16T06:31:21.280 に答える
1

@oldrinb が述べたように、2 つのUserクラスの等価性をテストする方法を明示的に伝える必要があります。そうしないと、findアルゴリズムは探しているアイテムを見つけることができません。これは、==演算子をオーバーライドすることによって行われます。

#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;

class MyCustomClass{
  public:
    MyCustomClass(int id) : id_(id) { }

   // Would produce the same error without this
   bool operator==(const MyCustomClass& b){
     return id_ == b.id_;
   }

   int id(){ return id_; }

  private:
    int id_;
};

int main(void){
  deque<MyCustomClass> q;
  q.push_back(MyCustomClass(1));
  q.push_back(MyCustomClass(2));
  q.push_back(MyCustomClass(3));
  deque<MyCustomClass>::iterator it = 
    find(q.begin(), q.end(), MyCustomClass(2));

  if ( it != q.end() ){
    printf("Found\n");
    q.erase(it);
  }else{
    printf("Not Found!\n");
  }

  for(it = q.begin(); it != q.end() ; it++)
    printf("%d ", it->id());

  printf("\n");

  return 0;
}
于 2012-09-16T06:36:41.000 に答える