Es scheint, dass der Iteratoradapter reverse_iterator
die meisten seiner verschachtelten Typen doppelt definiert. Insbesondere erbt es öffentlich von std::iterator
, das iterator_category
, value_type
, difference_type
, pointer
und reference
exponiert. Mit Ausnahme von iterator_category
und value_type
sind dies alle explizit typedef
'wieder in der Klassendefinition.Warum definiert reverse_iterator seine verschachtelten Typen doppelt?
24.5.1.1 Vorlage Klasse reverse_iterator [reverse.iterator]
namespace std {
template <class Iterator>
class reverse_iterator : public
iterator<typename iterator_traits<Iterator>::iterator_category,
typename iterator_traits<Iterator>::value_type,
typename iterator_traits<Iterator>::difference_type,
typename iterator_traits<Iterator>::pointer,
typename iterator_traits<Iterator>::reference> {
public:
typedef Iterator iterator_type;
typedef typename iterator_traits<Iterator>::difference_type difference_type;
typedef typename iterator_traits<Iterator>::reference reference;
typedef typename iterator_traits<Iterator>::pointer pointer;
// ... rest of the class
};
Frage: warum die wiederholte Definition? Ist das nur für die Zwecke der Exposition oder gibt es mehr dazu? Und warum nicht iterator_category
und value_type
neu definieren?
Es definiert auch nicht "value_type". Wie auch immer, diese Frage wird bald hoffnungslos werden, dank [LWG 2438] (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2438). –
@ T.C. Danke für das Ausgraben dieser DR. Ich habe das Q aktualisiert. Wenn du eine Antwort machst, akzeptiere ich. – TemplateRex
Vielleicht hat es mit abhängiger Namenssuche zu tun? Die von 'iterator' übernommenen Namen sind nicht in allen Fällen sichtbar, da es sich um eine abhängige Basisklasse handelt. – dyp