首页 文章

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

提问于
浏览
0

我有以下课程声明 -

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 >>> :: 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 request typename std :: map :: iterator it = polynomial.begin();

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

1 回答

  • 3

    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();
    

相关问题