A member function of a class template may be defined outside of the class template definition in which it is declared. [ Example:
template<class T> class Array { T* v; int sz; public: explicit Array(int); T& operator[](int); T& elem(int i) { return v[i]; } };
declares three function templates. The subscript function might be defined like this:
template<class T> T& Array<T>::operator[](int i) { if (i<0 || sz<=i) error("Array: range error"); return v[i]; }
— end example ]
The template-arguments for a member function of a class template are determined by the template-arguments of the type of the object for which the member function is called. [ Example: The template-argument for Array<T>::operator[]() will be determined by the Array to which the subscripting operation is applied.
Array<int> v1(20); Array<dcomplex> v2(30); v1[3] = 7; // Array<int>::operator[]() v2[3] = dcomplex(7,8); // Array<dcomplex>::operator[]()
— end example ]