簡體   English   中英

結構解引用運算符(operator->)

[英]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;
}

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類型與指向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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM