ArrayTP - это шаблонный класс, который будет иметь определение класса следующим образом:
template <typename T, size_t const Size>
class ArrayTP
{
private:
T Array[Size];
...
public:
ArrayTP()
{
...
}
};
Как вы можете видеть, параметр size используется для объявления массива такого размера (в стеке здесь). eggweights будет иметь массив из 12 элементов, а donuts - массив из 13 элементов.Компилятор генерирует два разных типа из определения класса шаблона - один с размером 12, а другой с размером 13.
Stack<int>
не принимает параметр размера, только тип.Тем не менее, конструктор этого класса, вероятно, имеет конструктор, который принимает целое значение для размера.Он будет иметь определение класса следующим образом:
template <typename T>
class Stack
{
private:
T *Array;
public:
Stack(size_t size)
{
Array = new T[size];
}
...
}
Компилятор генерирует только один тип класса, то есть Stack<int>
, а размер указывается в качестве параметра конструктора.Таким образом,
Stack<int> eggs(12);
Stack<int> dunkers(13)
оба являются объектами Stack - один размером 12, а другой размером 13.
В конечном счете, разница заключается в том, что ArrayTP
вы задаете размер в качестве параметра шаблона.во время компиляции с Stack
вы предоставляете его как параметр конструктора во время выполнения.Первый из них будет генерировать разные типы (ArrayTP, ArrayTP и т. Д.) Из определения шаблона для разных размеров.