#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)
参数,丢弃限定符
任何想法为什么会发生这种情况,因为对象本身并不是一个常数。
答案 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 &
,这意味着无法修改向量的内容。反过来,这意味着您不能在vec
和setBoo
的任何元素上调用非const成员函数。
答案 2 :(得分:0)
对象可能是const。虽然向量包含ABCs而不是const ABC,但是向量本身是const,所以当你在它上面调用operator []时,会使用运算符的const版本。向量上的const []的const版本返回vector :: const_reference。所以,我可以告诉你,你试图在const ABC&amp;。
上调用非const方法答案 3 :(得分:0)
作为另一种解决方法,您可以在向量中存储指向ABC对象的指针,它可以正常工作 - 尽管管理清理需要额外的费用。在这种情况下,您不会修改向量的内容,因为向量仅包含指针。