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_buffer并iter在我的头文件中声明,其中缓冲区被声明为deque类型int并且iter是常量迭代器:
// ...
std::deque<int> m_buffer;
std::deque<int>::const_iterator iter;
// ...
Run Code Online (Sandbox Code Playgroud)
取出const的displayQueue方法将消除编译器错误,但由于在这个功能应该不修改任何数据deque,我想保持我的代码"常量纠正",以更加明确.当我的迭代器是一个时,为什么会导致错误 const_iterator?
您无法在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成员,我会首先考虑没有它在所有成员,并使用一个局部变量来代替.