Как мне объявить итератор для карты со следующим шаблоном - std :: map <std :: string, T> my_map? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть следующее объявление класса -

template <typename T> 
class Polynomial{
  std::map<std::string, T> _polynomial_
}

В функции-члене я объявил итератор для этого -

typename std::map<std::string, T>::iterator it= _polynomial_.begin();

Завершенная функция-член выглядит так -

template <typename T>
void Polynomial<T>::print(std::ostream& out) const
{


  typename std::map<std::string, T>::iterator it= _polynomial_.begin();
  std::string term;
  while(it != _polynomial_.end()){


    term = it->second;
    term += it->first;
    if(it->first < (T)0){
      out << "-" << term;
    }
    else{
      out << "+" << term;
    }
    term = "";
    it++;
  }


}

В основном я вызываю функцию следующим образом -

 Polynomial <double> p1;

  p1.add_term("x0",9.862);

  std::cout << p1;

Однако, похоже, это не работает, и я получаю ошибки. GCC жалуется на ошибка преобразования -

Polynomial.hpp: 32: 47: ошибка: преобразование из \ u2018std :: map, double, std :: less>, std :: allocator, double>>> :: const_iterator {aka std :: _ Rb_tree_const_iterator, double> >} \ u2019 в нескалярный тип \ u2018std :: map, double, std :: less>, std :: allocator, double>>> :: iterator {aka std :: _ Rb_tree_iterator, double>>} \ u2019 запрошен имя типа std :: map :: iterator it = полином .begin ();

Может кто-нибудь сказать мне, как правильно объявить итератор?

1 Ответ

0 голосов
/ 05 ноября 2018

Polynomial<T>::print - это const функция-член, внутри которой элемент данных _polynomial_ тоже становится const, что означает, что _polynomial_.begin() возвращает const_iterator, который не может быть преобразован в iterator неявно. (Обратите внимание, что std::map::begin перегружен версией const и версией, отличной от const, первая возвращает const_iterator, а вторая возвращает iterator.)

Измените код на

typename std::map<std::string, T>::const_iterator it = _polynomial_.begin();
//                                 ^^^^^^

или используйте auto, вместо этого будет выведен правильный тип для вас.

auto it = _polynomial_.begin();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...