Re: template type dependent name lookup
Hyman Rosen schrieb:
Anthony Heading wrote:
template<int N> struct X { struct I {}; static void x(I) { } };
template <int N> struct Y : public X<N> {
typedef typename X<N>::I I;
void y() { x(I()); }
};
template struct Y<0>;
x.cpp(12): error: identifier "x" is undefined
detected during instantiation of "void Y<N>::y() [with N=0]"
This is because of 14.6.2/3:
"In the definition of ... a member of a class template, if a base class
of the class template depends on a template-parameter, the base class
scope is not examined during unqualified name lookup ... during an
instantiation of the ... member."
Hmmh, I wonder why this rule should be superior to
those of argument-dependent look-up described in 3.4.2?
Unfortunately it's not clear whether 14.6.2/3 should be
applied to ADL cases also (we have a lot of active issues
related to ADL).
Interestingly (due to a misunderstanding on my side?) I
would have applied 3.4.2/2, 2nd bullet from 14882:2003:
"If T is a class type [..], its associated classes are:
the class itself; the class of which it is a member, if any;
and its direct and indirect base classes. Its associated
namespaces are the namespaces in which its associated
classes are defined."
My reasoning would be so: During the first phase nothing
is found for x (because it would not look into X<N>), but
during the second phase at the POI it would recognize
that I belongs to the (now known!) Y base class X<0> and
thus x should be correctly found.
Do we have clarification needed here? According to
my understanding both reasonings could be applied and
result in two different results.
I further found that the current writing has changed in a
significant way (N2134): It removed the earlier existing
last bullet of 3.4.2/2 (which used the notion of template-id,
that would not apply for I) and changed the above
quoted 2nd bullet to
"If T is a class type [..], its associated classes are:
the class itself; the class of which it is a member, if any;
and its direct and indirect base classes. Its associated
namespaces are the namespaces in of which its associated
classes are defined members.
Furthermore, if T is a class template specialization, its
associated namespaces and classes also include: the
namespaces and classes associated with the types of
the template arguments provided for template type
parameters (excluding template template parameters);
the namespaces of which any template template arguments
are members; and the classes of which any member
templates used as template template arguments are
members. [ Note: Non-type template arguments do not
contribute to the set of associated namespaces. -end
note ]"
IMO the new wordings even strengthens my above
described argumentation, doesn't it?
Greetings from Bremen,
Daniel
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]