![](/img/trans.png)
[英]How to overload the arrow dereference operator->() not for solid objects but for pointers
[英]Structure dereference operator (operator->)
我正在為迭代器編寫一個瘦模板包裝器,並在通過結構解除引用操作符時遇到絆腳石,主要是因為指針沒有:
#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*’
以下方法有效,但我不認為它可以工作。 也就是說,如果迭代器的奇怪pointer
類型與指向value_type
的指針不同。
pointer operator->() {return &*internal;} //MARK3
標准間接地說,重載的operator->
必須返回一個指針,一個可轉換為指針的對象,或一個具有重載operator->
的對象。 你最好的選擇就是回歸internal
。
§13.5.6 [over.ref] p1
表達式
x->m
被解釋為(x.operator->())->m
(以上適用於遞歸。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.