# 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 `Vector`s. 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)