我正在为迭代器编写一个薄模板包装器,在通过结构取消引用运算符时遇到了绊脚石,主要是因为指针没有:
#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;
}
http://ideone.com/XdvEz
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*’
以下方法有效,但我不认为它一定有效。也就是说,如果一个迭代器有一个奇怪的pointer
与指向 a 的指针不同的类型value_type
.
pointer operator->() {return &*internal;} //MARK3
该标准间接表示超载operator->
必须返回一个指针、可转换为指针的对象或已重载的对象operator->
。你最好的选择就是返回internal
.
§13.5.6 [over.ref] p1
一种表达x->m
被解释为(x.operator->())->m
(以上内容递归适用。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)