https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102609
--- Comment #14 from Barry Revzin <barry.revzin at gmail dot com> --- > I am finding myself realizing that implementing this as a member function and > turning off member function bits seems to be more difficult than implementing > it as a static function and implementing member function bits will be. That's how I implemented this in EDG - static member functions that just have some extra powers. > Of these cases, is f0 or f1 and g0 or g1 correct? I assume the answer is f1 > and g1. Both are correct - you're still a member of S, so you don't have to qualify S::my_type (I mean, you can, it's not incorrect, but it's just not necessary - means the same thing either way). > When deduced, f0 or f1 and g0 or g1? I would definitely think f1 and g1 now. These now might actually mean different things. Unqualified my_type is still valid and means S::my_type (i.e. int). But Self::my_type could now mean a different type. Merging the two examples: struct S { using my_type = int; template<typename Self> void f0(this Self, my_type); template<typename Self> void f1(this Self, Self::my_type); }; struct D : S { using my_type = double; }; D().f0(2.0); // calls S::f0<D>, which takes an int D().f1(2.0); // calls S::f1<D>, which takes a double