我在使用 gcc 的非 const 容器上使用 const 反向迭代器时遇到问题。好吧,只有某些版本的 gcc。
#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;
}
此程序编译正常,可在 gcc 4.2.1 (Mac Leopard)、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,所以简单地使用较新的编译器对我来说并不是一个完美的解决方案。所以我想我需要改变我使用反向迭代器的方式。有什么建议吗?
最佳答案
这是现行标准的缺陷:http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#280
编辑:详细说明: 问题是,在当前标准中:
-
vector::reverse_iterator
指定为std::reverse_iterator<vector::iterator>
, 和vector::const_reverse_iterator
作为std::reverse_iterator<vector::const_iterator>
. std::reverse_iterator
上的关系运算符使用单个模板参数定义,使得reverse_iterator<iterator>
和reverse_iterator<const_iterator>
不可比较。
在您的代码中,您比较了 const_reverse_iterator
结果是在非常量 vector 上调用“rend()”,这是一个(非常量)reverse_iterator
.
在 C++0x 中,进行了两项相关更改以解决如下问题:
- reverse_iterator 上的关系运算符现在采用两个模板参数
- 像 vector 这样的容器有额外的方法来明确请求一个 const_iterator:cbegin()、cend()、crbegin() 和 crend()。
在您的情况下,解决方法是明确请求 const_reverse_iterator 用于 rend():
vector<char>::const_reverse_iterator r;
const vector<char>::const_reverse_iterator crend = v.rend();
for (r = v.rbegin(); r != crend; ++r)
cout << *r;
关于c++ - gcc reverse_iterator 比较运算符丢失了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2135094/