2011-12-16 81 views
9

我寫迭代器薄模板包裝,並創下絆腳石通過結構引用操作時,主要是因爲指針沒有一個:結構引用操作(操作符 - >)

#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 
+1

什麼版本的C++的具有*結構引用操作*? – 2011-12-16 19:14:53

+0

爲什麼char *`?在某處不會有某種`Iterator :: value_type`嗎? – 2011-12-16 19:25:11

回答

10

標準間接說,一個重載operator->必須或者返回一個指針,一個對象,它可轉化爲指針,或已超載operator->的對象。你最好的選擇就是返回internal

§13.5.6 [over.ref] p1

表達式x->m被解釋爲(x.operator->())->m

(以上遞歸地應用。)