[Bug c++/28330] finds wrong template overload; peculiar diagnostic

truedfx at gentoo dot org gcc-bugzilla@gcc.gnu.org
Sun Mar 2 10:57:00 GMT 2008



------- Comment #4 from truedfx at gentoo dot org  2008-03-02 10:57 -------
I only came across this bug looking for something else, but anyway, here's a
reduced testcase:

template <typename T>
class ring {};

template <typename T>
ring<T> &operator<<(ring<T>&, T *);

class base {};
class derived : public base {};

void f() {
  ring<base> r;
  derived *d;
  r << d;
}

I believe this code is invalid. The template argument can't be deduced, and
you'd need something like

template <typename T>
class ring {};

template <typename T>
struct non_deducible { typename T type; };

template <typename T>
ring<T> &operator<<(ring<T>&, typename non_deducible<T>::type *);

so that only the first argument is considered when choosing which T to use.

Or, more simply, make operator<< a member function.


-- 

truedfx at gentoo dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |truedfx at gentoo dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28330



More information about the Gcc-bugs mailing list