如何使用以下模板为地图声明迭代器 - std::map<std::string, T> my_map?

How do I declare an iterator for a map with the following template - std::map<std::string, T> my_map?

我有以下 class 声明 -

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++;
  }


}

在main中,我调用函数如下-

 Polynomial <double> p1;

  p1.add_term("x0",9.862);

  std::cout << p1;

但这似乎不起作用,而且我收到错误。海湾合作委员会抱怨 转换错误 -

Polynomial.hpp:32:47: 错误:从 \u2018std::map, double, std::less >, std::allocator, double> > >::[=41= 转换] {aka std::_Rb_tree_const_iterator, double> >}\u2019 到非标量类型 \u2018std::map, double, std::less >, std::allocator, double> > >::iterator {aka std::_Rb_tree_iterator, double> >}\u2019 请求 typename std::map::iterator it= 多项式.begin();

谁能告诉我迭代器的正确声明是什么?

Polynomial<T>::print是一个const成员函数,里面的数据成员_polynomial_也变成了const,也就是说_polynomial_.begin()returns 是 const_iterator,不能隐式转换为 iterator。 (注意std::map::begin重载了const版本和非const版本,前者returnsconst_iterator后者returnsiterator.)

将代码更改为

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

或使用 auto,它会为您推断出正确的类型。

auto it = _polynomial_.begin();