: This implies that a
template-parameter can be used in the
declaration of subsequent
template-parameters and their default
arguments but cannot be used in preceding
template-parameters or their
default arguments
. For example,
template<class T, T* p, class U = T> class X { /* ... */ };
template<class T> void f(T* p = new T);
This also implies that a
template-parameter can be used in the
specification of base classes
. For example,
template<class T> class X : public Array<T> { /* ... */ };
template<class T> class Y : public T { /* ... */ };
The use of a template parameter as a base class implies that a class used as a template
argument must be defined and not just declared when the class template is instantiated
. —
end note