用于修改非const对象的编译器错误

时间:2009-01-06 20:56:09

标签: c++

 #include "iostream"
 #include "vector"


 class ABC {

  private:
      bool m_b;
  public:
      ABC() : m_b(false) {}

      ABC& setBool(bool b) {
          m_b = b;
          return *this;
      }

      bool getBool() const {
          return m_b;
      }
};

 void foo(const std::vector<ABC> &vec) {

      vec[0].setBool(true);
 }

 int main(int argc, char*argv[]) {

     std::vector<ABC> vecI;
     ABC i;
     vecI.push_back(i);
     foo(vecI);
 }

当我编译它时,我收到此错误:传递const ABC作为this ABC& ABC::setBool(bool)参数,丢弃限定符

任何想法为什么会发生这种情况,因为对象本身并不是一个常数。

4 个答案:

答案 0 :(得分:6)

foo通过reference-to-const获取vec,你不能改变const。因此,要么删除调用setBool的行,要么如果你真的想设置bool,请将参数类型更改为std :: vector&amp;。

或者对实现更严格......你看,这两个函数存在:

T& vector<T>::operator[](int);  
T const& vector<T>::operator[](int) const;  

当你在const对象上调用“vec [i]”时,只有第二个有效,所以它被选中。但是这个重载显然会返回T const&amp;,这就是你无法改变的事情。

答案 1 :(得分:0)

foo需要const vector &,这意味着无法修改向量的内容。反过来,这意味着您不能在vecsetBoo的任何元素上调用非const成员函数。

答案 2 :(得分:0)

对象可能是const。虽然向量包含ABCs而不是const ABC,但是向量本身是const,所以当你在它上面调用operator []时,会使用运算符的const版本。向量上的const []的const版本返回vector :: const_reference。所以,我可以告诉你,你试图在const ABC&amp;。

上调用非const方法

答案 3 :(得分:0)

作为另一种解决方法,您可以在向量中存储指向ABC对象的指针,它可以正常工作 - 尽管管理清理需要额外的费用。在这种情况下,您不会修改向量的内容,因为向量仅包含指针。