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 类型可能不是真正的 int ,您确定有一个相等运算符可以对该类型的 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

发布一个无法编译的完整程序。这编译得很好:

#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 回答
0

对我来说很好(i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 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 回答