2

这种方法:

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在我的头文件中声明,其中缓冲区被声明为 a dequeof typeint并且iter是一个常量迭代器:

// ...

std::deque<int> m_buffer;
std::deque<int>::const_iterator iter;

// ...

删除方法const中的displayQueue将消除编译器错误,但由于此函数不应修改 中的任何数据deque,我想通过保持我的代码“常量正确”来明确这一点。当我的迭代器是 a 时,为什么这会导致错误 const_iterator

4

5 回答 5

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成员,而是使用一个局部变量,而不是创建一个成员。

于 2012-11-15T19:59:03.623 回答
2

因为您的成员函数是一个 const,这意味着您承诺不会更改此函数中的任何成员。好吧, iter 是一个成员,您正试图在函数中更改它,所以出现了错误。

于 2012-11-15T20:10:00.467 回答
1

您正在通过设置 const 迭代器成员变量的值来修改对象,从而使函数的 const 限制无效。使用局部变量。

A const_iteratoronly 表示迭代器不能修改序列,但您不是在修改序列,而是在修改成员变量 iterator本身

于 2012-11-15T19:56:17.227 回答
1

在 const 类型LRU的对象中,iter成员是 const,因此您不能在该循环中修改它。您需要制作一份单独的副本。这就是标准库算法采用迭代器对象的原因:因此它们可以修改迭代器对象以在序列中移动,即使存在 const 的底层容器对象。

于 2012-11-15T19:57:52.930 回答
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。

于 2012-11-15T19:58:45.807 回答