C++ Templates and Friends
This document assumes you're familiar with the idea of friends and of templates.
Look at this program. It's a completion of example code from Bjarne Stroustrup's "The C++ Programming Language" (Special Edition, section C.13.2, p.854)
template<class T> class Matrix; template<class T> class Vector; template<class T> Vector<T> operator*(const Matrix<T>& m, const Vector<T>& v) { Vector<T> r; for (int i=0;i<4;i++) { r.v[i]=0; for(int j=0;j<4;j++) r.v[i]+=m.v[i].v[j]*v.v[j]; } return r; } template<class T> class Vector{ T v[4]; public: friend Vector operator*<> (const Matrix<T>&, const Vector&); }; template<class T> class Matrix{ Vector<T> v[4]; public: friend Vector<T> operator*<> (const Matrix&, const Vector<T>&); }; int main() { Matrix<int> m1; Vector<int> v1,v2; v2=m1*v1; }
My attention was drawn to the example because it uses <>, which I hadn't seen before. To understand the code I suggest you start at the Vector definition. Vector objects have 4 elements. Matrix objects have 4 Vectors. Both have the operator* function as a friend so that the function can access their private fields. The <> on the friend lines is so that the compiler doesn't make the default assumption that operator* is a non-template function.
Now look at the top of the file. The first 2 lines are forward declarations - necessary because of the interlinked nature of the subsequent code's use of the defined classes. The operator* function itself is straightforward if you've met const, references and templates before.
But I don't know why the signatures of operator* in the 2 class definitions are different. Experimenting, I found that they can be the same (both argument definitions ending in <T>&) so somehow the "missing" details are being picked up by default in the original code.
See Also
- Friends and Templates (from IBM)
- Barton-Nackman trick
- Tech Talk About C++ Templates (Comeau Computing)