This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 112c. See for the official list.


1005. Qualified name resolution in member functions of class templates

Section: 11.4.3  [class.mfct.non.static]     Status: NAD     Submitter: Doug Gregor     Date: 2009-11-19

It's not clear how lookup of a non-dependent qualified name should be handled in a non-static member function of a class template. For example,

    struct A {
      int f(int);
      static int f(double);

    struct B {};

    template<typename T> struct C : T {
      void g() {

The call to A::f inside C::g() appears non-dependent, so one might expect that it would be bound at template definition time to A::f(double). However, the resolution for issue 515 changed 11.4.3 [class.mfct.non.static] paragraph 3 to transform an id-expression to a member access expression using (*this). if lookup resolves the name to a non-static member of any class, making the reference dependent. The result is that if C is instantiated with A, A::f(int) is called; if C is instantiated with B, the call is ill-formed (the call is transformed to (*this).A::f(0), and there is no A subobject in C<B>). Both these results seem unintuitive.

(See also issue 1017.)

Notes from the November, 2010 meeting:

The CWG agreed that the resolution of issue 515 was ill-advised and should be reversed.

Rationale (March, 2011):

The analysis is incorrect; whether the reference is dependent or not, overload resolution chooses A::f(int) because of the rules in [] paragraph 3 dealing with contrived objects for static member functions.