【问题标题】:cannot bind const_iterator to const_iterator无法将 const_iterator 绑定到 const_iterator
【发布时间】:2021-02-20 14:12:50
【问题描述】:
#include <iostream>
#include <vector>

using namespace std;

void print(vector<int>::const_iterator &beg, vector<int>::const_iterator &end);

int main()
{
    vector<int> ivec = {1, 2, 3, 4, 5};
    print(ivec.cbegin(), ivec.cend());

    return 0;
}

void print(vector<int>::const_iterator &beg, vector<int>::const_iterator &end)
{
    if (beg == end)
    {
        cout << "over" << endl;
        return;
    }
    cout << *beg << endl;
    print(++beg, end);
}

ubuntu 20,g++ 9.0

rec_print_vect.cpp: In function ‘int main()’:
rec_print_vect.cpp:11:19: error: cannot bind non-const lvalue reference of type ‘std::vector<int>::const_iterator&’ {aka ‘__gnu_cxx::__normal_iterator<const int*, std::vector<int> >&’} to an rvalue of type ‘std::vector<int>::const_iterator’ {aka ‘__gnu_cxx::__normal_iterator<const int*, std::vector<int> >’}
   11 |  print(ivec.cbegin(), ivec.cend());
      |        ~~~~~~~~~~~^~
rec_print_vect.cpp:6:41: note:   initializing argument 1 of ‘void print(std::vector<int>::const_iterator&, std::vector<int>::const_iterator&)’
    6 | void print(vector<int>::const_iterator &beg, vector<int>::const_iterator &end);
 

const int &amp;i = 10 是法律,对吧?为什么const_iterator 不能?我很困惑。这个程序只想递归打印一个向量。我想为迭代器使用参考。因为我不需要修改向量中的元素,所以我将 const_iterator 与 cbegin() 和 cend() memeber 函数一起使用。我认为将 const var 引用绑定到 const var 或文字值是正确的。但是我的代码无法通过编译阶段。如果我在函数形式参数中使用 const_iterator 而不是 const_iterator&,我的代码可以运行良好。

【问题讨论】:

    标签: c++ recursion pass-by-reference function-definition const-iterator


    【解决方案1】:

    给你:

    void print(vector<int>::const_iterator beg, vector<int>::const_iterator end);
    

    问题是,您不能将临时(由 begin() 等返回的迭代器)绑定到非常量引用。所以要么接受vector&lt;int&gt;::const_iterator const&amp;,要么按值获取那些迭代器(这还不错)。

    【讨论】:

      【解决方案2】:

      函数参数

      void print(vector<int>::const_iterator &beg, vector<int>::const_iterator &end);
      

      是非常量引用。虽然此调用中的参数

      print(ivec.cbegin(), ivec.cend());
      

      是由成员函数cbegincend 返回的临时对象。您不能将非常量左值引用与临时对象绑定。

      像这样声明函数

      void print(vector<int>::const_iterator beg, vector<int>::const_iterator end);
      

      请注意,由于该语句,该函数在为空向量调用时可能会调用未定义的行为

      if (beg + 1 == end)
      

      函数可以定义得更简单。

      void print(vector<int>::const_iterator beg, vector<int>::const_iterator end)
      { 
          if ( beg != end )
          {
              std::cout << *beg << '\n';
              print( ++beg, end );
          }
      }
      

      或者可以按照下面的演示程序来定义函数。

      #include <iostream>
      #include <vector>
      #include <iterator>
      
      std::ostream & print( std::vector<int>::const_iterator beg, 
                            std::vector<int>::const_iterator end, 
                            std::ostream &os = std::cout )
      {
          return beg != end ? os << *beg << '\n', print( ++beg, end ) : os;
      }
      
      int main() 
      {
          std::vector<int> ivec = {1, 2, 3, 4, 5};
          
          print( std::begin( ivec ), std::end( ivec ) ) << std::endl;
          
          return 0;
      }
      

      它的输出是

      1
      2
      3
      4
      5
      

      【讨论】:

      • 已修复该错误。
      猜你喜欢
      • 2012-09-30
      • 2012-11-29
      • 2011-11-13
      • 2011-12-07
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2021-02-11
      • 2013-12-10
      相关资源
      最近更新 更多