Листинг 13.11. «Использование» шаблона стека
#include "TStack.h" // подключение "определения"
// помещаем в стек числа
#include <iostream> #include <string> using namespace std; int main() { TStack<double> t;
t.push(l);
t.push(2);
t.push(3);
// пока стек не пустой
// выводим число с вершины
// удаляем элемент из стека
cout << t.countO << endl; while (!t.emptyO) { cout << t.topO << endl; double p = t.pop();
}
// помещаем в стек числа
cout << t.countO << endl; TStack<string> S;
S.push("one");
S.push("two");
// пока стек не пустой
// удаляем элемент из стека
// выводим строку
S.push("three"); cout << S.countO << endl; while (!S.emptyO) { string p = S.popO I
cout << p << endl;
}
// стек пустой - генерируется исключение
cout << S.countO << endl; try { string p = S.popO ; } catch(const exception &e) { cout << e.whatO << endl; } return 0;
}
Транслируется все нормально — компилятор ошибок не обнаруживает (система Visual C++.NET 2003). Однако при компоновке выдается 13 (!) сообщений! Причина заключается, конечно, в отсутствии инстанцирования шаблона1.
Позвольте, но вот же в функции mai п ()!... Однако у нас три отдельных модуля в проекте. Поэтому когда компилятор обрабатывает определение и реализацию
Точнее, в отсутствии инстанцирования методов класса-шаблона.
шаблона-стека, у него нет указаний, что шаблон должен быть инстанцирован для каких-то конкретных аргументов. Когда же компилятор «видит» определение объекта-стека, наподобие одного из следующих, в его поле зрения нет реализации:
TStack<double> t; TStack<string> 5:
Поэтому компилятор не может выполнить инстанцирование реализации, но предполагает, что где-то в других частях это сделано, и оставляет «пустую» ссылку компоновщику. Компоновщик, естественно, ничего не находит, так как инстан-цирования-то компилятор не выполнил! |