मैं iterators के लिए एक पतली टेम्पलेट आवरण लिख रहा हूँ, और एक बड़ी बाधा मारा जब संरचना भिन्नता ऑपरेटर के माध्यम से गुजर, जिसका मुख्य कारण संकेत नहीं है एक:संरचना भिन्नता ऑपरेटर (ऑपरेटर>)
#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
सी ++ के किन संस्करणों का एक * संरचना भिन्नता ऑपरेटर है *? –
क्यों 'char * '? क्या कहीं कुछ 'Iterator :: value_type' नहीं होगा? –
@ थॉमस मैथ्यूज: यही वही है [विकिपीडिया] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Member_and_pointer_operators) इसे कॉल करता है। सी ++ मानक बस इसे 'ऑपरेटर->' कहते हैं। –