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_bufferヘッダーファイルでiter宣言されています。ここで、バッファーはdequeof 型として宣言されてintおりiter、定数イテレーターです。

// ...

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

// ...

constメソッド内のを削除displayQueueするとコンパイラ エラーが解消されますが、この関数は 内のデータを変更してはならないためdeque、コードを "const-correct" に保つことでこれを明示的にしたいと考えています。イテレータが の場合、これがエラーになるのはなぜ const_iteratorですか?

4

5 に答える 5

5

メンバーメソッドでクラスのメンバーを変更することはできません。これconstが、ここで実行しようとしていることです。

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

iterはのメンバーであるため、メンバー関数class LRUで割り当て、インクリメント、またはその他の方法で変更することはできません。const

1つの解決策は、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オブジェクトではLRUiterメンバーは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()メソッドは、Dequeconstまたはnon const値を返すようにオーバーロードされており、この場合、nonconst値を取得します。あるいは、iterのタイプをconstではないことを明示的に示すこともできます。

于 2012-11-15T19:58:45.807 に答える
1

const iterator メンバー変数の値を設定してオブジェクトを変更しているため、関数の const 制限が無効になります。ローカル変数を使用します。

Aconst_iteratorは、反復子がシーケンスを変更できないことを意味しますが、シーケンスを変更するのではなく、メンバー変数 iterator自体を変更します。

于 2012-11-15T19:56:17.227 に答える