
David Abrahams <dave@boost-consulting.com> writes: | Gabriel Dos Reis <gdr@integrable-solutions.net> writes: | | > If you follow the first principle that scopes nest, then the "C" in | > the altenrative #1 gets hidden by the member S<>::C in the local scope of | > S<>::f()-body (current situation). If you want something different, | > you'll end up with a notion similar to "parallel scopes" or | > "injection of enclosing scope into the enclosed scopes" (which is | > contrary to "scopes nest"). | | You could just use the rule that each template parameter list forms | a scope that encloses whatever it adorns. Yes. And that is what we currently have and that leads to the member name hides the enclosing template-parameter name rule. There are two observations to make: (1) in order to "minimize surprises", there is an additional rule saying that it is not permitted to (directly) redeclare a template-parameter name in the scope it adorns. (2) the cases where there still are surprises (The case David Vandevoorde posted) is when the member-name comes from a base class. This case may be surprising to some because names in base classes are not directly declared -- therefore point (1) can't apply. Rather, they are found through lookup that proceeds from inner-to-outer scope search. I believe that the proposed rule about invalid template-parameter renaming is a minimal damage to the general "scopes nest" principle. | Then the reading that's obvious to me follows "from first principles". That would work for member templates (assuming we change/clarify the current rules) but it would not resolve the issue mentioned by David Vandevoorde to his satisfaction. -- Gaby