Class Templates

C++The relationship between a class template and an individual class is like the relationship between a class and an individual object. An individual class defines how a group of objects can be constructed, while a class template defines how a group of classes can be generated.

Note the distinction between the terms class template and template class:

Class template
is a template used to generate template classes. You cannot declare an object of a class template.

Template class
is an instance of a class template.

A template definition is identical to any valid class definition that the template might generate, except for the following:

A class template can be declared without being defined by using an elaborated type specifier. For example:

template<class L,class T> class key;

This reserves the name as a class template name. All template declarations for a class template must have the same types and number of template arguments. Only one template declaration containing the class definition is allowed.

Note:
When you have nested template argument lists, you must have a separating space between the > at the end of the inner list and the > at the end of the outer list. Otherwise, there is an ambiguity between the output operator >> and two template list delimiters >.

template<class L,class T> class key { /* ... */};
template<class L> class vector { /* ... */ };
 
int main ()
{
   class key <int, vector<int> > my_key_vector;
   // implicitly instantiates template
}

Objects and function members of individual template classes can be accessed by any of the techniques used to access ordinary class member objects and functions. Given a class template:

template<class T> class vehicle
{
public:
    vehicle() { /* ... */ }    // constructor
    ~vehicle() {};             // destructor
    T kind[16];
    T* drive();
    static void roadmap();
    // ...
};

and the declaration:

vehicle<char> bicycle; // instantiates the template

the constructor, the constructed object, and the member function drive() can be accessed with any of the following (assuming the standard header file <string.h> is included in the program file):

constructor
vehicle<char> bicycle;
 
// constructor called automatically,
// object bicycle created
object bicycle
strcpy (bicycle.kind, "10 speed");
bicycle.kind[0] = '2';
function drive() char* n = bicycle.drive();
function roadmap() vehicle<char>::roadmap();

Related References

IBM Copyright 2003