2011-12-16 15 views
9

yapı KQUEUE operatörü geçerken işaretçiler yok başlıca çünkü yineleyiciler için ince bir şablon sarıcı yazma ve bir engel isabet am tek:Yapısı KQUEUE operatörü (operatöre>)

#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*’ 

Bu aşağıdaki yöntem çalışır, ama çalışması garanti sanmıyorum. Yani, bir yineleyici, value_type işaretçisiyle aynı olmayan garip bir pointer türüne sahipse.

pointer operator->() {return &*internal;} //MARK3 
+1

C++ hangi sürümü * a * yapısı KQUEUE operatörü sahiptir? –

+0

Neden char * '? Bir yerde bir çeşit “Iterator :: value_type” olmaz mıydı? –

+3

@ThomasMatthews: İşte bu [wikipedia] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Member_and_pointer_operators) buna diyor. C++ standardı sadece “operatör->” diyor. –

cevap

10

standart dolaylı bir aşırı operator-> bir işaretçi, bir işaretçi veya operator-> aşırı yüklenmiş bir nesneye dönüştürülebilen bir nesneyi döndürmek için ya söylüyor. En iyi bahsiniz internal'u geri göndermenizdir.

§13.5.6 [over.ref] p1

bir ifade x->m(x.operator->())->m

olarak yorumlanır (yukarıda yinelemeli uygulanır.)

+0

Ve 'operator *()' hakkında soru sormadan önce, return türü 'iterator_traits :: reference' ve sadece' * yineleyici '. Dereferansta bir "referans" döndürmeyen herhangi bir yineleyici, yineleyici kavramını doğru bir şekilde modellememekte ve sansasyonel olarak göz ardı edilebilmektedir. – Xeo

+0

Evet, operatörü * aldım, ama bir "işaretçi" yerine bir "yineleyici" döndürmek için hiçbir zaman bana ağlamadı. Teşekkürler! Bunun cevabın olmasını bekliyorum ama diğer öneriler için bir gün veya daha fazlasını vermeye çalışacağım. –

+0

Sadece bir işaretçi döndüğünde (veya bir işaretçiye dönüştürülebilen bir nesne), özyinelemenin sona erdiğini, böylece eğer operatör -> bir geri döndürme tabelasını döndürdüğünüzde, yineleme tabanına çarptıysanız ve işiniz bittiyse ekleyebilirim. Operatör -> operatör-> aşırı yük ile başka bir şey döndürürse, tekrarlarsınız. Bu açık görünebilir, ama bunu çözmek için biraz zaman aldı. –