首页 文章

迭代器和模板

提问于
浏览
1

我试图操纵迭代器 .

template <typename Mytype>
class Myclass
 {
   public:
   Myclass ( const Mytype & myarg)
   {
    this->data=myarg;
   }
   ~Myclass ( void ){}
    set<int> Test ( const Mytype & myarg ) const
    {
      set<int> result;
      typename Mytype::iterator it=myarg.begin();
      return result;
    }
   private:
    //
    mutable Mytype data;
 };

这段代码正在编译 . 但是当我想使用它时,它不再编译:这是一个例子:

int main()
 {
    Myclass <string> t0 ( "caacaa" );
    set<int> r=t0.Test("a");
    return 0;
 }

我现在得到一个错误:

test.cpp: In member function ‘std::set<int>
Myclass<Mytype>::Test(const Mytype&) const [with Mytype =
std::basic_string<char>]’:
test.cpp:38:26: instantiated from here
test.cpp:25:48: error: conversion from
‘std::basic_string<char>::const_iterator {aka
__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >}’ to non-scalar type ‘std::basic_string<char>::iterator {aka
__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >}’ requested

我试图弄清楚出了什么问题,但我不明白这个错误 .

1 回答

  • 5

    在const成员函数中,成员数据也是const . 所以你需要使用 const_iterator

    typename Mytype::const_iterator it = myarg.begin();
    

    因为 myarg.begin() 返回const迭代器,因为 myarg 是const,因为成员函数是const .

    更好用 auto

    auto it = myarg.begin();
    

    但是你仍然需要知道 it 是const - auto 可以帮助你避免输入长名称,而不知道 it 是const的事实 .

相关问题