Chr*_*uns 5 c++ gcc iterator stl
我在使用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;
}
Run Code Online (Sandbox Code Playgroud)
这个程序编译好并运行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>]()'
Run Code Online (Sandbox Code Playgroud)
这是早期版本的gcc中的错误吗?
由于Mac上的gcc 4.2.1存在其他问题,我们需要在Mac上使用gcc 4.0.1,因此简单地使用较新的编译器对我来说不是一个完美的解决方案.所以我想我需要改变我使用反向迭代器的方式.有什么建议?
Éri*_*ant 10
这是当前标准的一个缺陷: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>不可比性.在你的代码中,你将a const_reverse_iterator与在非const向量上调用"rend()"的结果进行比较,这是一个(非const)reverse_iterator.
在C++ 0x中,进行了两个相关的更改来修复这样的问题:
在您的情况下,解决方法是明确请求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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1896 次 |
| 最近记录: |