ошибка обратного итератора: нет соответствия для ‘operator!=’ в ‘rcit != std::vector::rend() с _Tp = int, _Alloc = std::allocator’

#c #iterator

#c #итератор

Вопрос:

КОД A:

 vector< int >::const_reverse_iterator rcit;
vector< int >::const_reverse_iterator tit=v.rend();
for(rcit = v.rbegin(); rcit != tit;   rcit)
cout << *rcit << " ";
  

КОД B:

 vector< int >::const_reverse_iterator rcit;
for(rcit = v.rbegin(); rcit != v.rend();   rcit)
cout << *rcit << " ";
  

КОД A работает нормально, но
почему КОД B выдает ошибку :

РАЗРАБОТЧИК C vector_test.cpp нет соответствия для ‘operator!=’ в ‘rcit != std::vector<_Tp, _Alloc>::rend() с _Tp = int, _Alloc = std::allocator’.

Это программа, которую я пытался написать.

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;
using namespace std;
#include <vector>
using std::vector;
template< typename T > void printVector( const vector< T > amp;v);

template< typename T > 
void printVector( const vector< T > amp;v)
{
             typename vector< T >::const_iterator cit;
             for(cit = v.begin(); cit != v.end();   cit)
             cout << *cit << " ";
}

int main()
{
    int number;
    vector< int > v;

    cout << "Initial size of the vector : " << v.size()
         << " and capacity : " << v.capacity() << endl;
    for(int i=0; i < 3; i  )
    {
            cout << "Enter number : ";
            cin >> number;
            v.push_back(number);
    }
    cout << "Now size of the vector : " << v.size()
         << "and capacity : " << v.capacity() << endl;

    cout << "output vector using iterator notation " << endl; 
    printVector(v);

    cout << "Reverse of output ";
    vector< int >::const_reverse_iterator rcit;
    for(rcit = v.rbegin(); v.rend() != rcit ;   rcit)
    cout << *rcit << " ";
    cin.ignore(numeric_limits< streamsize >::max(), 'n'); 
    cin.get();
return 0;
}
  

Комментарии:

1. Опубликуйте еще немного кода… опубликованный вами код не является проблемой…

2. ваш код отлично компилируется для меня с mingw в Windows

3. хм, спасибо, @Vusak, это может быть мой компилятор DevC … хм

4. @munish Да, я только что наткнулся на ту же ошибку, используя DevC . Благодаря вашему вопросу здесь, я нашел обходной путь в кратчайшие сроки!

5. Это воспроизводимо с компилятором Android NDK версии 9 (и, возможно, более ранних версий)

Ответ №1:

Проблема в том, что существует две формы rend метода:

 reverse_iterator rend();
const_reverse_iterator rend() const;
  

При выполнении сравнения кажется, что используется первый (хотя я не знаю почему), и оператор != для сравнения ‘const’ и ‘non-const’ итератора не определен. Однако при присвоении переменной компилятор может определить правильную функцию для вызова, и все это работает правильно.

Комментарии:

1. P.S. Ваша программа отлично работает для моей компиляции с gcc в Linux.

2. Спасибо, sje397 это еще раз подтверждает, что ошибка может быть связана с моим компилятором DevC 4.9.9.2. Я не очень разбираюсь в компиляторах, я получил его онлайн и начал использовать. Я не знаю, какой компилятор подходит для изучения и практики C . Можете ли вы предложить некоторые.

3. Я бы посоветовал компилятор Visual Studio для Windows (есть бесплатная версия ‘express’) и gcc в других местах — я почти ничего больше не трогал.

4. @sj397, ваше объяснение выше кажется нормальным, я думаю, потому что, если я просто использую неконстантную версию итератора, он компилируется нормально, проблема возникает только при использовании const_reverse_iterator .

Ответ №2:

Я не получаю никаких ошибок или предупреждений при компиляции следующего в Xcode 4 или codepad:

 #include <iostream>
#include <vector>

int main () {
    using namespace std;
    vector< int > v;

    vector< int >::const_reverse_iterator rcit;
    for(rcit = v.rbegin(); rcit != v.rend();   rcit)
        cout << *rcit << " ";
}
  

Отличается ли ваша программа от этого каким-либо существенным образом? Какой компилятор вы используете? Работает ли предложение огняна? А что, если заменить != на == ? (Я знаю, что это вызвало бы ошибку во время выполнения, но мне любопытно, как на это отреагирует компилятор.)

Комментарии:

1. Примечание: Ваш полный список программ также отлично компилируется.

2. Нет, предложение @ognian не сработало. и я просто скопировал ваш код, вставил и запустил. выдает ту же ошибку, возможно, это моя версия компилятора DevC 4.9.9.2.Я не пробовал == хотя.@ Вусак также скомпилировал мой код, и все было в порядке

3. Спасибо, да, это работает так, как это делали почти все выше и ниже. Это компилятор . Мне нужно протестировать это в другом месте

4. Похоже, что DevC использует MinGW. Я удивлен, что вы столкнулись с этой проблемой. В качестве альтернативы, быстрый и беспроблемный способ поиграть с C — это онлайн-среда, такая как codepad . А в Windows Visual Studio Express 2010 — это IDE, которую я бы настоятельно рекомендовал.

Ответ №3:

Попробуйте поменять местами операнды != следующим образом:

 for(rcit = v.rbegin(); v.rend() != rcit;   rcit)
  

Комментарии:

1. @Nawaz: в некоторых дерьмовых реализациях STL это делает