在声明为'const'的函数中使用'const_iterator'迭代集合会导致错误

时间:2012-11-15 19:53:10

标签: c++ stl iterator const deque

此方法:

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_bufferiter在我的头文件中声明,其中缓冲区被声明为类型为deque的{​​{1}},而int是一个常量迭代器:

iter

删除// ... std::deque<int> m_buffer; std::deque<int>::const_iterator iter; // ... 方法中的const将消除编译器错误,但由于此函数不应修改displayQueue中的任何数据,因此我希望通过保持我的代码“const-correct”。当我的迭代器是deque

时,为什么会导致错误?

5 个答案:

答案 0 :(得分:5)

您无法在const成员方法中修改任何类的成员,而这正是您在此处尝试执行的操作:

for(iter = m_buffer.begin();iter != m_buffer.end(); ++iter)
    ^^^^^^^                                         ^^^^^^

iterclass 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是一个成员,你试图在函数中更改它,所以有错误。