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

dtg*_*dtg 2 c++ iterator stl const deque

这个方法:

void LRU::displayQueue() const
{
   for(iter = m_buffer.begin(); iter != m_buffer.end(); ++iter)
      std::cout << (*iter) << " ";
   std:: cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

导致以下错误:

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
Run Code Online (Sandbox Code Playgroud)

m_bufferiter在我的头文件中声明,其中缓冲区被声明为deque类型int并且iter是常量迭代器:

// ...

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

// ...
Run Code Online (Sandbox Code Playgroud)

取出constdisplayQueue方法将消除编译器错误,但由于在这个功能应该不修改任何数据deque,我想保持我的代码"常量纠正",以更加明确.当我的迭代器是一个时,为什么会导致错误 const_iterator

Joh*_*ing 5

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

for(iter = m_buffer.begin();iter != m_buffer.end(); ++iter)
    ^^^^^^^                                         ^^^^^^
Run Code Online (Sandbox Code Playgroud)

iter是成员class LRU,因此您不能在const成员函数中分配,增加或以其他方式更改它.

一个解决方案是使iter变量:

mutable std::deque<int>::const_iterator iter;
Run Code Online (Sandbox Code Playgroud)

但我的感觉是大多数用途mutable都表明了设计缺陷.在这种情况下,我怀疑首先iter成为一个成员class LRU是一个潜在的设计缺陷.你为什么需要/想要这个?

因此,而不是使iter一个mutable成员,我会首先考虑没有它在所有成员,并使用一个局部变量来代替.