В попередньому прикладі всі методи шаблону класу були визначені всередині класу. Якщо ж методи визначаються поза специфікацією класу, то слід використовувати інший синтаксис. Далі приведена програма показує, як можна це зробити.
//контекстно залежне імя класу
#include<iostream>
#include<conio.h>
using namespace std;
const int MAX=100;
template<class Type>
class Stack
{private:
Type st[MAX];
int top;
public:
Stack() ;
void push(Type var);
Type pop();
};
/////////////
template<class Type>
Stack<Type>::Stack()
{top=-1;
}
template<class Type>
void Stack<Type>::push(Type var)
{st[++top]=var;
}
template<class Type>
Type Stack<Type>::pop()
{
return st[top--];
}
///////////
int main()
{ Stack<float> s1;
s1.push(1111.1F);
s1.push(2222.2F);
s1.push(3333.3F);
cout<<"1: "<<s1.pop()<<endl;
cout<<"2: "<<s1.pop()<<endl;
cout<<"3: "<<s1.pop()<<endl;
///////
Stack<long> s2;
s2.push(123123123L);
s2.push(234234234L);
s2.push(345345345L);
cout<<"1: "<<s2.pop()<<endl;
cout<<"2: "<<s2.pop()<<endl;
cout<<"3: "<<s2.pop()<<endl;
getch();
return 0;
}
Програма 14.4
Вираз template<class Type> повинен випереджати не тільки визначення класу, але й кожен метод, визначений поза тілом класу. От як виглядає функція push()
template<class Type>
void Stack<Type>::push(Type var)
{st[++top]=var;
}
Ім’я Stack<Type> використовується для того, щоб ідентифікувати клас, чиїм методом є push().
Для звичайного нешаблонного імені Stack було б достатньо
void Stack::push(var)
Але для шаблону функції доводиться використовувати ще й шаблонний аргумент Stack<Type>
Отже, ім’я шаблонного класу виглядає по-різному залежно від контексту. Всередині специфікації класу це просто ім’я Stack. Для методу, визначеного поза класом, це ім’я класу та ім’я шаблонного аргументу Stack<Type>. Коли ми визначаємо реальні об’кти для зберігання конкретного типу даних, іменем шаблонного класу буде ім’я класу та ім’я типу
Stack<float> s1;