bug-report: operator overloading in template classes

Thorsten Holtkaemper thorsten.holtkaemper@gmd.de
Mon Sep 11 06:55:00 GMT 2000

I think I've found a bug in the gcc C++ compiler concerning operator
overloading in template classes.

Overloading the +operator (for example) in a template class in two ways,
one as a member function and one as friend function (of course with
different arguments), doesn't compile, if I define the functions outside
the template declaration. It works, if I define the functions inside the
template declaration.

A corresponding .ii file is attached.

Compile output (with version information) is here:

g++ -v --save-temps mathtest.C -o mathtest

Reading specs from /usr/lib/gcc-lib/i486-suse-linux/2.95.2/specs
gcc version 2.95.2 19991024 (release)
 /usr/lib/gcc-lib/i486-suse-linux/2.95.2/cpp -lang-c++ -v -D__GNUC__=2
-D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -D__ELF__ -Dunix
-D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix
-D__linux -Asystem(posix) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386)
-Di386 -D__i386 -D__i386__ -Di486 -D__i486 -D__i486__ mathtest.C
GNU CPP version 2.95.2 19991024 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
End of search list.
The following default directories have been omitted from the search

End of omitted list.
 /usr/lib/gcc-lib/i486-suse-linux/2.95.2/cc1plus mathtest.ii -quiet
-dumpbase mathtest.cc -version -o mathtest.s
GNU C++ version 2.95.2 19991024 (release) (i486-suse-linux) compiled by
GNU C version 2.95.2 19991024 (release).
paMath.H: In instantiation of `paVec3<double>':
mathtest.C:6:   instantiated from here
paMath.H:15: invalid use of undefined type `class paVec3<double>'
paMath.H:16: forward declaration of `class paVec3<double>'
paMath.H:15: confused by earlier errors, bailing out

I hope it will help you!
Best regards and thanks for all your work,
Thorsten Holtkaemper.
# 1 "mathtest.C"
# 1 "paMath.H" 1

template<class C> class paVec3;
template<class C> const paVec3<C> operator+(const C&, const paVec3<C>&);

template<class C> class paVec3
		C vdata[3];
		const paVec3<C> operator+(const C&) const;
		friend const paVec3<C> operator+ <> (const C&, const paVec3<C>&);

template<class C>
inline const paVec3<C> paVec3<C>::operator+(const C& right) const
	return paVec3<C>(vdata[0]+right, vdata[1]+right, vdata[2]+right);

template<class C>
inline const paVec3<C> operator+(const C& left, const paVec3<C>& right)
	return paVec3<C>(left + right.vdata[0],
			 left + right.vdata[1],
			 left + right.vdata[2]);

# 1 "mathtest.C" 2

int main(void)
 	paVec3<double> v;
	v + 1.;
	1. + v;
	return 0;

More information about the Gcc-bugs mailing list