|
|
|||
![]() |
Department of Engineering |
| University of Cambridge > Engineering Department > computing help > Languages > C++ |
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.
| | C++ | Languages | computing help | |