我在使用gcc的非const容器上使用const反向迭代器时遇到了问题。那么,只有某些版本的gcc。gcc reverse_iterator比较运算符缺失?
#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;
}
这个程序编译OK,并用gcc 4.2.1(苹果豹),并与Visual Studio 8和9(Windows)中运行,并与GCC 4.1.2(Linux)的。
但是,gcc 3.4.4(cygwin)和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>]()'
这是早期版本的gcc中的错误吗?
由于Mac上gcc 4.2.1的其他问题,我们需要在Mac上使用gcc 4.0.1,所以使用新的编译器对我来说不是一个完美的解决方案。所以我想我需要改变我如何使用反向迭代器。有什么建议么?
对于解决方法,'!(r == v.rend())'工作吗?或者,您可以通过'r.base()'与非反向版本一起尝试。 – 2010-01-25 19:47:49
更可能是遗漏;我认为对整个STL的全力支持*仍然在继续,尽管非常接近。在3.4.4的日子里,它有点不完整。 – meagar 2010-01-25 19:49:42
@gf尼斯尝试,“!(r == v.rend())”不起作用。缺少“!=”和“==”运算符。 – 2010-01-25 20:58:18