0

私は次のように構成されたプログラムを持っています:

class A {
    private:
        std::set<B> members;
    public:
        void func(const C& arg) {
            std::set<B>::iterator iter = members.find(a);
            if(iter != members.end()) {
                iter->check(arg);
            }
        }
}



class B {
    private:
        std::deque<C> writers;
    public:
        void check(const C& arg) {
            if(std::find(writers.begin(), writers.end, arg) != writers.end()) {
                /* Code */
            }
        }
}


class C {
  private:
      int id;
  public:
      bool operator==(const C& arg) {
          return arg.id == this->id;
      }
}

これをコンパイルすると、次のエラーメッセージが表示されます。

no matching function for call to ‘B::check(const C&) const’  
note: candidates are: void B::check(const C&) <near match>

そのように宣言するcheck()const、コンパイラは、==クラスCのオーバーロードされた演算子をとして宣言することを要求するエラーをスローしますconstconstオーバーロードされた演算子を正しい方法で作成するかどうかはわかりません。(私は一度それを試しました、そして私が思い出すことができる限りそれはまたいくつかのエラーを与えました)。

私はこれを5日以上解決しようとしましたが、まだリードがありません。

4

3 に答える 3

3

まず最初にoperator== すべきことはconstです。ユーザーを混乱させたくない限り、データを変更したり、変更したりすることはありません。一般に、オブジェクトの状態を変更する必要のないすべての関数はconst、最大限の柔軟性を提供するようにする必要があります(つまり、定数参照による呼び出しを許可します)。

同じことが適用できます。B::checkテストのみを行い、変更を行わない場合は、になりますconst。そして、の拡張によりA::func、変更する必要がない場合は、constである必要があります。

エラーメッセージは、コンパイラによってわずかに異なります。あなたの場合、コンパイラはオーバーロード解決を実行し、それが文句を言うものである呼び出しに一致するものを見つけられませんでした:

'B :: check(const C&)const' <br>の呼び出しに一致する関数がありません注:候補は次のとおりです:void B :: check(const C&)

constこれは、メンバーを見たが、タグ付きのメンバー関数が必要だったために破棄したことを示しています。他のコンパイラでは、エラーメッセージに次の行が含まれます。呼び出しvoid B::check(const C&)は少し複雑な修飾子を破棄constし、const参照で非constメンバー関数を呼び出すには修飾子を無視する必要があると言おうとします。

于 2012-09-27T15:54:17.030 に答える
3

あなたは間違いなく宣言しなければなりませんB::check()、そして彼らはオブジェクトの状態で何も変更しないので。C::operator==const

また、それほど明白ではないかもしれませんが、std::set<B>::iterator実際にはconst_iterator(C ++ 11コンパイラを使用していると仮定して)です!したがって、イテレータBを介してオブジェクトから非const関数メンバーを呼び出すことはできません。set

于 2012-09-27T15:59:20.667 に答える
-1

可能であれば、非定数バージョンを選択する必要があることを忘れないでください。少なくともこれはスコットメイバーが言ったことです。

ここに長い議論があります:

const_iteratorsよりもイテレータを優先する必要がありますか?

于 2012-09-27T16:00:33.637 に答える