模板在同一个文件中,是可以声明和定义分离的
template <class T>
class stack
{
public:
stack(size_t capacity = 4)//定义,定义在类里面,函数会变成内联函数
:_a(nullptr)
,_top(0)
,_capacity(0)
{
if (capacity > 0)
{
_a = new T[capacity];
_capacity = capacity;
_top = 0;
}
}
void pop()//定义
{
assert(_top>0);
_top--;
}
bool Empty()//定义
{
return _top == 0;
}
const T& Top()//定义
{
assert(_top > 0);
return _a[_top - 1];
}
~stack()//定义
{
delete[] _a;
_a = nullptr;
_top = _capacity = 0;
}
void push(const T& x);//声明,如果它在类里定义,也可以。但它太长了,不符合内联函数
private:
T* _a;
size_t _top;
size_t _capacity;
};
template <class T>//在类外定义,必须写
void stack<T>::push(const T& x)//定义,注意:必须注明定义的函数对应哪个类里面的声明
{
if (_top == _capacity)
{
size_t Newcapacity = _capacity == 0 ? 4 : _capacity * 2;
T* tmp = new T[Newcapacity];
if (_a)
{
memcpy(tmp, _a, sizeof(T) * _top);
delete[] _a;
}
_a = tmp;
_capacity = Newcapacity;
}
_a[_top] = x;
_top++;
}
int main()
{
try
{
stack<int> st1;
stack<int> st2(0);
}
catch (const exception& e)
{
cout << e.what() << endl;
}
}