结构取消引用运算符(operator->) [英] Structure dereference operator (operator->)
问题描述
我为迭代器编写一个简单的模板包装器,当通过结构dereference运算符时遇到一个绊脚石,主要是因为指针没有一个:
I am writing a thin template wrapper for iterators, and hit a stumbling block when passing through the structure dereference operator, mainly because pointers don't have one:
#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;
}
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*’
以下方法有效,但我不认为它可以工作。也就是说,如果迭代器有一个奇怪的指针
类型与指向 value_type
的指针不一样。 / p>
This following method works, but I don't think it's guaranteed to work. Namely, if an iterator has a strange pointer
type that isn't the same as a pointer to a value_type
.
pointer operator->() {return &*internal;} //MARK3
推荐答案
标准间接说明重载 operator->
必须返回一个指针,一个可转换为指针的对象,或一个重载 operator->
的对象。最好的办法是返回 internal
。
The standard indirectly says that an overloaded operator->
has to either return a pointer, an object that is convertible to a pointer, or an object that has overloaded operator->
. Your best bet is to just return internal
.
§13.5.6[ ref] p1
表达式
x-> m
解释为(x.operator->()) - > m
(以上适用于递归。)
这篇关于结构取消引用运算符(operator->)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!