此方法:
void LRU::displayQueue() const
{
for(iter = m_buffer.begin(); iter != m_buffer.end(); ++iter)
std::cout << (*iter) << " ";
std:: cout << std::endl;
}
导致以下错误:
lru.cpp:58: error: passing 'const std::_Deque_iterator<int, const int&, const int*>' as 'this' argument of 'std::_Deque_iterator<int, const int&, const int*>& std::_Deque_iterator<int, const int&, const int*>::operator=(const std::_Deque_iterator<int, const int&, const int*>&)' discards qualifiers
m_buffer
和iter
在我的头文件中声明,其中缓冲区被声明为类型为deque
的{{1}},而int
是一个常量迭代器:
iter
删除// ...
std::deque<int> m_buffer;
std::deque<int>::const_iterator iter;
// ...
方法中的const
将消除编译器错误,但由于此函数不应修改displayQueue
中的任何数据,因此我希望通过保持我的代码“const-correct”。当我的迭代器是deque
?
答案 0 :(得分:5)
您无法在const
成员方法中修改任何类的成员,而这正是您在此处尝试执行的操作:
for(iter = m_buffer.begin();iter != m_buffer.end(); ++iter)
^^^^^^^ ^^^^^^
iter
是class LRU
的成员,因此您无法在const
成员函数中分配,增加或以其他方式更改它。
一种解决方案是使iter
可变:
mutable std::deque<int>::const_iterator iter;
但我的感觉是mutable
的大多数用途都表明存在设计缺陷。在这种情况下,我怀疑iter
首先成为class LRU
的成员是一个潜在的设计缺陷。你为什么需要/想要这个?
所以,我不是让iter
成为mutable
成员,而是首先考虑不让它成为成员,而是使用局部变量。
答案 1 :(得分:1)
您正在通过设置const迭代器成员变量的值来修改对象,从而使函数的const限制无效。使用局部变量。
const_iterator
仅表示迭代器无法修改序列,但您不修改序列,修改成员变量迭代器本身。
答案 2 :(得分:1)
在LRU
类型的const对象中,iter
成员是const,因此您无法在该循环中修改它。您需要单独复制它。这就是标准库算法采用迭代器对象的原因:所以他们可以修改迭代器对象来遍历序列,即使有一个基础容器对象是const。
答案 3 :(得分:1)
void LRU::displayQueue() const
{
// std::_Deque_iterator<int, const int&, const int*> l_iter = m_buffer.begin();
for(auto l_iter = m_buffer.begin(); l_iter != m_buffer.end(); ++l_iter)
std::cout << (*l_iter) << " ";
std::cout << std::endl;
}
应该有效。正如其他人所说,const值无法修改。 begin()
类上的Deque
方法被重载以返回const或非const值,在这种情况下,它将获取非const值。或者,您可以明确地将iter的类型表示为不是const。
答案 4 :(得分:1)
因为您的成员函数是const,这意味着您承诺不更改此函数中的任何成员。好吧,iter是一个成员,你试图在函数中更改它,所以有错误。