This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: 3.4 Bug? template dependent name lookup fails from template functions


Michael
   $ cat t7.cc
   void F(int) {}
   void F(char) {}

template <class T> struct A {};

template <class T>
void F(const A<T> & )
{
T t;
F(t); // ok for T=double
::F( t ); // fails for T=double, does not find F(double)
}
void F(double) { } // This will be found, if moved before F<T>
int main()
{
A<double> a;
F(a); // shouldn't ::F(T) [for T=double] be looked up here?
}


$ $gcc34/bin/g++ -c t7.cc t7.cc: In function `void F(const A<T>&) [with T = double]':
t7.cc:18: instantiated from here
t7.cc:11: error: call of overloaded `F(double&)' is ambiguous
t7.cc:1: note: candidates are: void F(int)
t7.cc:2: note: void F(char)

The :: operator is unavoidable when F is a template member function. Also, I thought that '::F(T)' is a template dependent name that should
be looked up only during template instantiation.
no, it is not. [14.6.2] says
	postfix-expression (expression-list-opt)
is only dependent if
1) postfix-expression is an identifier
2) at least one expression in the list has dependent type

::F is not an identifier, therefore ::F(a) is bound to the set of ::F visible
in the template definition.

nathan

--
Nathan Sidwell    ::   http://www.codesourcery.com   ::     CodeSourcery LLC
nathan@codesourcery.com    ::     http://www.planetfall.pwp.blueyonder.co.uk



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]