This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Template with friend methods problem
- To: gcc at gcc dot gnu dot org
- Subject: Template with friend methods problem
- From: Christian Savard <savardch at IRO dot UMontreal dot CA>
- Date: Mon, 11 Sep 2000 12:06:11 -0400
- Full-Name: Christian Savard
Hi,
I can't get the following code to compile under Linux with gcc-2.95.2.
I've looked through the mailing-list archive and FAQ with no success.. Is this a
known bug? I'm pretty sure it's something I'm doing wrong.
I would appreciate any help or comments.
Thank you in advance
C.
Here's the error message I get:
../../Include/CGMath/Vec2.h: In instantiation of `cVec2<double>':
../../Include/LandGen/Hf.h:48: instantiated from here
../../Include/CGMath/Vec2.h:29: invalid use of undefined type `class
cVec2<double>'
../../Include/CGMath/Vec2.h:67: forward declaration of `class cVec2<double>'
And here's a small chunk of code from this class:
// Forward declaration for friends templates
template< class T >
class cVec2;
template< class T >
cVec2<T> operator*( const T &lOperand, const cVec2<T> &lVec );
template< class T >
cOStream& operator<<( cOStream &lStream, const cVec2<T> &lVec );
template< class T >
cIStream& operator>>( cIStream &lStream, cVec2<T> &lVec );
template< class T > class cVec2
{
friend cVec2<T> operator*<>( const T &lOperand, const cVec2<T> &lVec );
friend cOStream& operator<<<>( cOStream &lStream, const cVec2<T> &lVec );
friend cIStream& operator>><>( cIStream &lStream, cVec2<T> &lVec );
...
};
// Typedefs
typedef cVec2< int > cVec2i;
typedef cVec2< float > cVec2f;
typedef cVec2< double > cVec2d;
template< class T >
inline cVec2<T>
operator*
( const T & lOperand, const cVec2<T> &lVec )
{
return cVec2<T>( lVec.mData[0] * lOperand, lVec.mData.mData[1] * lOperand );
}
template< class T >
inline cOStream&
operator<<
( cOStream &lStream, const cVec2<T> &lVec )
{
return lStream << lVec.mData[0] << " " << lVec.mData[1];
}
template< class T >
inline cIStream&
operator>>
( cIStream &lStream, cVec2<T> &lVec )
{
return lStream >> lVec.mData[0] >> lVec.mData[1];
}