Sto riscontrando un problema nell'utilizzo di iteratori inversi const su contenitori non-const con gcc. Bene, solo alcune versioni di gcc.operatori di confronto gt reverse_iterator mancanti?
#include <vector>
#include <iostream>
using namespace std;
int main() {
const char v0[4] = "abc";
vector<char> v(v0, v0 + 3);
// This block works fine
vector<char>::const_iterator i;
for (i = v.begin(); i != v.end(); ++i)
cout << *i;
cout << endl;
// This block generates compile error with gcc 3.4.4 and gcc 4.0.1
vector<char>::const_reverse_iterator r;
for (r = v.rbegin(); r != v.rend(); ++r)
cout << *r;
cout << endl;
return 0;
}
Questo programma viene compilato OK e viene eseguito con gcc 4.2.1 (Mac Leopard) e con Visual Studio 8 e 9 (Windows), e con gcc 4.1.2 (Linux).
Tuttavia, c'è un errore di compilazione con gcc 3.4.4 (cygwin) e con gcc 4.0.1 (Mac Snow Leopard).
test.cpp:18: error: no match for 'operator!=' in 'r != std::vector<_Tp, _Alloc>::rend() [with _Tp = char, _Alloc = std::allocator<char>]()'
Si tratta di un bug nelle versioni precedenti di gcc?
A causa di altri problemi con gcc 4.2.1 su Mac, dobbiamo usare gcc 4.0.1 su Mac, quindi usare semplicemente il compilatore più recente non è una soluzione perfetta per me. Quindi suppongo di dover cambiare il modo in cui utilizzo gli iteratori inversi. Eventuali suggerimenti?
Per una soluzione alternativa, '! (R == v.rend())' funziona? In alternativa puoi provare con la versione non inversa tramite 'r.base()'. –
Più probabile un'omissione; Penso che il pieno supporto per l'intero STL sia * ancora * in corso, anche se molto vicino. Ai tempi di 3.4.4 era un po 'incompleto. – meagar
@gf Bel tentativo, "! (R == v.rend())" non funziona. Entrambi gli operatori "! =" E "==" sono mancanti. –