CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 3 of 3
  1. #1
    Join Date
    Jul 2005
    Location
    Louisville, CO, USA
    Posts
    23

    templates and operator overloading

    Hello,

    I'am trying to write my own vector class. It is implemented using templates and operator overloading.

    In ordern to allow vector addition this global method is implemented

    template<typename T>
    CVector3D<T> operator+( const CVector3D<T> &v1, const CVector3D<T> &v2 )
    {
    return( CVector3D<T>( v1._x + v2._x, v1._y + v2._y, v1._z + v2._z ) );
    }


    In the class definition I define this method as a friend of it,

    template<typename T>
    class CVector3D
    {
    public:

    friend CVector3D<T> operator+( const CVector3D<T> &, const CVector3D<T> & );
    ...

    but the linking process fails with

    if g++ -DHAVE_CONFIG_H -I. -I/home/sschmidt/Develop/vectors/src -I.. -O0 -g3 -MT vectors.o -MD -MP -MF ".deps/vectors.Tpo" -c -o vectors.o /home/sschmidt/Develop/vectors/src/vectors.cpp; \
    then mv -f ".deps/vectors.Tpo" ".deps/vectors.Po"; else rm -f ".deps/vectors.Tpo"; exit 1; fi
    In file included from /home/sschmidt/Develop/vectors/src/vectors.cpp:29:
    /home/sschmidt/Develop/vectors/src/cvector3d.h:62: Warnung: »friend«-Deklaration »CVector3D<T> operator+(const CVector3D<T>&, const CVector3D<T>&)« deklariert eine Nicht-Template-Funktion
    /home/sschmidt/Develop/vectors/src/cvector3d.h:62: Warnung: (wenn das nicht beabsichtigt war, sollte sicher gestellt werden, dass das Funktions-Template bereits deklariert wurde, und <> hier hinter Funktionsnamen einfügen) -Wno-non-template-friend schaltet diese Warnung aus)
    /bin/sh ../libtool --tag=CXX --mode=link g++ -O0 -g3 -o vectors vectors.o
    g++ -O0 -g3 -o vectors vectors.o
    vectors.o(.text+0x1b5): In function `main':
    /home/sschmidt/Develop/vectors/src/vectors.cpp:49: undefined reference to `operator+(CVector3D<float> const&, CVector3D<float> const&)'
    collect2: ld returned 1 exit status


    This is probably related to an earlier warning

    Warning: »friend« declaration »CVector3D<T> operator+(const CVector3D<T>&, const CVector3D<T>&)« declares a non-template-function
    Warning: (if this was not intended you should make sure the function template is already declared and add <>
    after the name of the function ) -Wno-non-template-friend switches this warning off

    Adding
    class CVector3D<T>;
    CVector3D<T> operator+( const CVector3D<T> &, const CVector3D<T> & );

    before the class definition in order to declare the method does not help either.
    Does anyone knows what to do?

    The following should work:

    CVector3D<float> v1, v2, v3;

    ...

    v3 = v1 + v2;


    Kind regards,

    Sven Schmidt

  2. #2
    Join Date
    Oct 2000
    Location
    London, England
    Posts
    4,773

    Re: templates and operator overloading

    It's the old template-friend problem. operator+ is a template function. So the order is:

    Code:
    template < typename T > class CVector3D;
    
    template < typename T >
     CVector3D<T> operator+( const CVector3D<T>, const CVector3D<T> );
    
    template < typename T >
    class CVector3D
    {
        friend CVector3D operator+ <> ( const CVector3D< const CVector3D );
    // etc.
    };
    
    template < typename T >
     CVector3D<T> operator+( const CVector3D<T>, const CVector3D<T> )
    {
      // implement it here
    }
    By the way I've never heard of a 3-dimensional vector. (Surely it's a 3D matrix?)

  3. #3
    Join Date
    Jul 2005
    Location
    Louisville, CO, USA
    Posts
    23

    Re: templates and operator overloading

    Quote Originally Posted by NMTop40
    It's the old template-friend problem. operator+ is a template function. So the order is:

    Code:
    template < typename T > class CVector3D;
    
    template < typename T >
     CVector3D<T> operator+( const CVector3D<T>, const CVector3D<T> );
    
    template < typename T >
    class CVector3D
    {
        friend CVector3D operator+ <> ( const CVector3D< const CVector3D );
    // etc.
    };
    
    template < typename T >
     CVector3D<T> operator+( const CVector3D<T>, const CVector3D<T> )
    {
      // implement it here
    }
    By the way I've never heard of a 3-dimensional vector. (Surely it's a 3D matrix?)

    Thank you very much, seems I was close to solving the problem myself :-)
    The vectors live in 3 dim. space, that's what I meant.

    Thanks again, Sven

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured