5

constとして宣言したいメソッドを作成しましたが、コンパイラーが文句を言います。トレースしてみると、メソッドのこの部分が問題の原因であることがわかりました。

bool ClassA::MethodA(int x)
{
    bool y = false;
    if(find(myList.begin(), myList.end(), x) != myList.end())
    {
        y = true;
    }
    return y;
}

メソッドにはそれ以上のことが起こっていますが、他のすべてが取り除かれているため、これはメソッドをconstにすることができなかった部分でした。stl findアルゴリズムがメソッドのconstを妨げるのはなぜですか?それは何らかの形でリストを変更しますか?

4

4 に答える 4

5

myListがカスタムコンテナタイプのオブジェクトである場合、begin()メソッドとend()メソッドにconstオーバーロードがないと、問題が発生する可能性があります。また、おそらくxの型が実際にはコードに含まれていないと仮定すると、その型のconstメンバーを操作できる等式演算子があると確信していますか?

于 2010-03-19T00:24:39.233 に答える
2

私はあなたの実装をコピーしましたが、問題はありませんでした。

class ClassA
{
    vector<int> myList;
public:
    bool MethodA(int x) const;
};

bool ClassA::MethodA(int x) const
{
    bool y = false;
    if (find(myList.begin(), myList.end(), x) != myList.end())
        y = true;

    return y;
}

メソッド定義(上記で投稿したもの)をconstにしようとしたとき、メソッド宣言も変更したことを覚えていますか?

于 2010-03-19T00:21:48.507 に答える
0

私にとっては問題なく動作します(i686-apple-darwin10-g ++-4.2.1(GCC)4.2.1(Apple Inc.ビルド5646)):

#include <list>
#include <algorithm>

class ClassA
{
public:
  ClassA() { myList.push_back(1); myList.push_back(2); }
  bool MethodA(int x) const;
private:
  std::list<int> myList;
};

bool ClassA::MethodA(int x) const
{
  bool y = false;
  if(find(myList.begin(), myList.end(), x) != myList.end())
    {
      y = true;
    }
  return y;
}

int main( int argc, char** argv )
{
  ClassA a;
  a.MethodA(5);
  return 0;
}
于 2010-03-19T00:19:20.383 に答える
0

コンパイルに失敗した完全なプログラムを投稿してください。これはうまくコンパイルされます:

#include <list>
#include <algorithm>
#include <iostream>

struct Foo {
    std::list<int> ml;
    bool search(int x) const {
        return std::find(ml.begin(), ml.end(), x) != ml.end();
    }
};

int main() {
    const Foo f;
    std::cout << f.search(0) << "\n";
}

たぶんfind、あなたが思っている関数を呼び出していないのかもしれません[編集:おそらく、ばかげた私、myListはstd::list]ではありません。問題を示す小さなプログラムに切り詰めると、おそらく原因が明らかになります。ある時点で何かを削除して、それが機能し始めるからです。

于 2010-03-19T00:21:42.203 に答える