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