"Нет совпадения для оператора =" пытается перебрать карту в C ++ - PullRequest
4 голосов
/ 30 августа 2011

Я пытаюсь перебрать карту, определенную следующим образом:

std::map< size_type, std::pair<size_t, unsigned int> > ridx_;

Теперь я пытаюсь перебрать ridx_ (который является закрытым членом класса) в следующей функции другакоторый перегружает оператор << </p>

std::ostream& operator<<(std::ostream &os, const SMatrix &m) 
{
  std::map< size_type, std::pair<size_t, unsigned int> >::iterator it;

  //The following is line 34
  for (it = m.ridx_.begin(); it !=  m.ridx_.end(); it++)
    os << it->first << endl;

  return os;
}

Однако ошибки g ++ выводятся с:

SMatrix.cpp: 34: ошибка: нет совпадения с оператором = in в it = m-> SMatrix :: ridx_.std :: map <_Key, _Tp, _Compare, _Alloc> :: начинаться с _Key = unsigned int, _Tp = std :: pair, _Compare = std :: less, _Alloc = std :: allocator>>'/usr/include/c++/4.3/bits/stl_tree.h:152: примечание: кандидатами являются: std :: _ Rb_tree_iterator>> & std :: _ Rb_tree_iterator>> :: operator = (const std :: _ Rb_tree_iterator>> &)make: * [myTest] Ошибка 1

Что я делаю не так?

1 Ответ

12 голосов
/ 30 августа 2011

Поскольку m (и, следовательно, m.ridx_) является константой, вы должны использовать std::map< size_type, std::pair<size_t, unsigned int> >::const_iterator, а не ::iterator.

Если вы используете компилятор C ++ 0x, вывозможно, стоит рассмотреть возможность использования auto:

for (auto it = m.ridx_.begin(); it != m.ridx_.end(); it++)
...