
Vladimir Prus wrote:
Fredrik Blomqvist wrote:
Wouldn't it be convenient if iterator_adaptor provided a protected "self typedef" for use by client code? In particular I'm thinking of the constructor case that basically always is feeding an iterator to the iterator_adaptor baseclass, thus needing its explicit type. (In most examples and tests this typedef is manually created as a 'super_t' for example).
Having a predefined type would reduce the amount of boilerplate code and the risk of getting out-of-sync with the declaration. I suggest a name something like 'iterator_adaptor_t' instead of 'super_t' to lessen name-clash possibility.
I'm not sure this is going to work:
template<class T> class yours : public iterator_facade<T, ...> { public: yours(.....) : super_t(.......) { } };
When compiler parses the above, name lookup does not use the scope of iterator_facade, so no matter what's typedefed there, 'super_t' won't be found.
Initially I had similar thoughts but since it compiled (and worked ok) in VC7.1 I figured it might be legal and would be a neat improvement. Reproducing the situation: ------------------ template <class T, class Y> class base { protected: typedef base<T, Y> super_t; public: explicit base(T const& v) : m_v(v) {} private: T m_v; }; template <class T> class derived : public base<T, T*> { public: derived(T const& v) : super_t(v) {} }; derived<int> test(123); ---------------- I tried out the code above in Comeau online (strict mode) and -- it failed :( msg: "super_t" is not a nonstatic data member or base class of class "derived<T>" Confirming your theory. In VC7.1 and Comeau non-strict (relaxed) mode it compiled fine though.. Oh, well. Regards // Fredrik