Boost logo

Boost :

From: Fredrik Blomqvist (fredrik_blomqvist_at_[hidden])
Date: 2004-07-08 09:42:47

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
I figured it might be legal and would be a neat improvement.

Reproducing the situation:
template <class T, class Y>
class base
 typedef base<T, Y> super_t;
 explicit base(T const& v) : m_v(v) {}
 T m_v;

template <class T>
class derived : public base<T, T*>
 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
Confirming your theory.
In VC7.1 and Comeau non-strict (relaxed) mode it compiled fine though..

Oh, well.

// Fredrik

Boost list run by bdawes at, gregod at, cpdaniel at, john at