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
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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk