A g++ template bug?

H.J. Lu hjl@lucon.org
Fri Sep 25 10:10:00 GMT 1998


For egcs-2.92.11 19980923, I got

# gcc -c foo.cc
# nm --dem foo.o | grep __doadv
	U __doadv(complex<double> *, complex<double> const &)

As you you see, __doadv is not mangled as a template function. If
I take friend out

# gcc -B/home/work/build/bin/egcs/gcc/ -c foo.cc -DNOFRIEND
# nm --dem foo.o | grep __doadv
	U complex<double> & __doadv<double>(complex<double> *, complex<double> const &)

Any ideas?

Thanks.


-- 
H.J. Lu (hjl@gnu.org)
----
template <class _FLT>
class complex
{
public:
  complex& operator /= (const complex&);
#ifndef NOFRIEND
  friend complex& __doadv<> (complex *, const complex&);
#endif
};

template <class _FLT> complex<_FLT>&
__doadv (complex<_FLT>* ths, const complex<_FLT>& r);

template <class _FLT>
inline complex<_FLT>&
complex<_FLT>::operator /= (const complex<_FLT>& r)
{
  return __doadv (this, r);
}

class complex<double>
{
public:
  complex& operator/= (const complex& r) { return __doadv (this, r); }
#ifndef NOFRIEND
  friend complex& __doadv<> (complex *, const complex&);
#endif
};

complex<double> z;
complex<double> &x = z;

void
foo (const complex<double> &y)
{
  x /= y;
}



More information about the Gcc mailing list