Я сделал несколько вопросов об оценке C ++ и наткнулся на эту хитрую программу.
#include <deque>
#include <iostream>
using namespace std;
template<typename T>
ostream & print(T &start, T &end)
{
for(; start != end; ++start)
{
cout<< *start<< " ";
}
return cout;
}
int main()
{
int tab[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
deque<int> d1(tab, tab+10);
deque<int> d2;
deque<int>::iterator it;
for(it = d1.begin(); it != d1.end(); ++it)
{
d2.push_back(d1[d1.end()-it-1]); //LINE I
}
print(d2.rbegin(), d2.rend()) << endl; //LINE II
return 0;
}
Я выбрал опцию Программа будет успешно работать и отображать: 1 2 3 4 5 6 7 8 9 10
Позже я скомпилировал программу, чтобы проверить ее, и она не компилируется с сообщением об ошибке:
$g++ -o main *.cpp main.cpp: In function ‘int main()’: main.cpp:25:17: error: cannot bind non-const lvalue reference of type ‘std::reverse_iterator<std::_Deque_iterator<int, int&, int*> >&’ to an rvalue of type ‘std::deque<int>::reverse_iterator {aka std::reverse_iterator<std::_Deque_iterator<int, int&, int*> >}’ print(d2.rbegin(), d2.rend()) << endl; //LINE II
~~~~~~~~~^~ main.cpp:6:32: note: initializing argument 1 of ‘std::ostream& print(T&, T&) [with T = std::reverse_iterator<std::_Deque_iterator<int, int&, int*> >; std::ostream = std::basic_ostream<char>]’ template<typename T> ostream & print(T &start, T &end)
^~~~~
Это сообщение об ошибке было на самом деле одним из вариантов, но я не думал,это не скомпилируется.
Я не очень понимаю, в чем проблема.Я подумал, что если я изменю параметры функции print
, как показано ниже, она будет скомпилирована и успешно запущена:
template<typename T> ostream & print(T start, T end)
{
for(; start != end; ++start)
{
cout<< *start<< " ";
}
return cout;
}
Почему это так?Как понять сообщение об ошибке, если параметры функции print
были ссылками?