
Brian McNamara <lorgon@cc.gatech.edu> writes:
Apologies ahead of time if I am putting words in anyone's mouth.
I think Dave wants to imply that the class T in his example is not allowed to have a member named U according to Gaby's proposed rule.
That's what I thought he meant.
But this isn't how the rule would work; the way I see it, _these_:
struct Base { typedef int U; };
template <class U> struct Derived : Base { }; // illegal
struct Derived2 : Base { template <class U> void f(U u) {} // illegal };
would be illegal ("the name U already has another meaning; choose another name for your template parameter"), whereas _these_:
struct Base { typedef int U; };
template <class B, class U> struct Derived : B { }; /* ... Derived<Base> ... */
template <class B> struct Derived2 : B { template <class U> void f(U u) {} }; /* ... Derived2<Base> ... */
are both fine, since Base's "U" is hidden by virtue of being a dependent name. There is still an issue of what happens if one of these last two classes issues a "using B::U" in its body; presumably then "U" ought to become outlawed as a valid template parameter name.
Just my two cents here...
OK, I think I understand now. I think it's a bizarre and inconsistent rule. Shall we outlaw: struct Base { static int x; }; struct Derived : Base { void f(int x) {} // Horrors! we're masking a base class member! }; Sorry for the sarcasm; it'll wear off by tomorrow. -- Dave Abrahams Boost Consulting www.boost-consulting.com