Moo*_*uck 9 c++ templates iterator operator-overloading
我正在为迭代器编写一个瘦模板包装器,并在通过结构解除引用操作符时遇到绊脚石,主要是因为指针没有:
#include <vector>
struct mystruct {
int member;
};
template<class iterator>
struct wrap {
typedef typename std::iterator_traits<iterator>::pointer pointer;
iterator internal;
pointer operator->() {return internal.operator->();} //MARK1
};
int main() {
wrap<std::vector<mystruct>::iterator> a;
a->member;
wrap<mystruct*> b;
b->member;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
prog.cpp: In member function ‘typename std::iterator_traits<_Iter>::pointer wrap<iterator>::operator->() [with iterator = mystruct*]’:
prog.cpp:18: instantiated from here
prog.cpp:11: error: request for member ‘operator->’ in ‘((wrap<mystruct*>*)this)->wrap<mystruct*>::internal’, which is of non-class type ‘mystruct*’
Run Code Online (Sandbox Code Playgroud)
以下方法有效,但我不认为它可以工作.也就是说,如果迭代器的奇怪pointer类型与指向a的指针不同value_type.
pointer operator->() {return &*internal;} //MARK3
Run Code Online (Sandbox Code Playgroud)
Xeo*_*Xeo 10
标准间接地说,重载operator->必须返回一个指针,一个可转换为指针的对象,或一个已经过载的对象operator->.你最好的选择就是回归internal.
§13.5.6 [over.ref] p1
表达式
x->m被解释为(x.operator->())->m
(以上适用于递归.)
| 归档时间: |
|
| 查看次数: |
4618 次 |
| 最近记录: |