模板类文件位置:声明和定义均要在头文件中进行,否则会出现链接错误,不可只在头文件声明,在cpp文件中定义
环境VS2019
模板类中的友元函数声明:在类内声明友元函数时,需要在上面加上 模板头 template<class T>,否则会报错,具体原因网址
https://bbs.youkuaiyun.com/topics/120094418
构造函数中使用return;不影响结果,貌似是这样,在我这个例子
sequentialStack.h
#pragma once
#ifndef SEQUENTIALSTACK_H
#define SEQUENTIALSTACK_H
#include<iostream>
#include<ostream>
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
template<typename T>
class seqStack
{
public:
seqStack(int numSize);
~seqStack();
void push(const T& elem);//进栈
void pop(T& elem);//出栈
bool empty();//查看栈是否为空
int getSize();//返回栈中元素的个数
void clearStack();//清空栈中的元素
void print();//打印栈中的元素
template<typename T>
friend ostream& operator<<(ostream& os, seqStack<T>& s);//必需这样写否则报错
private:
int maxsize;//栈最大的空间
T *element;//存放栈中的元素的栈数组
int top;//栈顶指针
};
template<typename T>
seqStack<T>::seqStack(int numSize) {
maxsize = numSize;
element = new T[maxsize];
if (element == nullptr) {
cout << "内存分配失败!";
return;//用return无值不会报错,有值就会报错
}
top = -1;//保证top与数组元素同时移动
}
template<typename T>
seqStack<T>::~seqStack() {
if (element != nullptr)
delete[]element;
}
//进栈
template<typename T>
void seqStack<T>::push(const T& elem) {
if (top < maxsize - 1)
element[++top] = elem;
else
cout << "超过数组范围" << endl;
}
//出栈
template<typename T>
void seqStack<T>::pop(T& elem) {
elem = element[top--];
element[top + 1] = 0;//置零
}
//查看栈是否为空
template<typename T>
bool seqStack<T>::empty() {
if (top == -1)
return true;
else
return false;
}
//返回栈中元素的个数
template<typename T>
int seqStack<T>::getSize() {
return top + 1;
}
//清空栈中的元素
template<typename T>
void seqStack<T>::clearStack() {
while (!empty())
element[top--] = 0;
}
template<typename T>
ostream& operator<< (ostream& os, seqStack<T>& s)
{
os << "栈中元素个数为:" << s.getSize() << ". " << endl;
/*os << s.print();*///由于print()为void,这样写会报错
return os;//注意该友元函数是有返回值的
}
//打印栈中的元素
template<typename T>
void seqStack<T>::print() {
int index = 0;
cout << "栈中元素为: ";
while (index <= top)
cout << element[index++] << " ";
cout << endl;
}
#endif // !SEQUENTIALSTACK_H
main.cpp
#include"sequentialStack.h"
int main()
{
seqStack<int>stack(20);
int val;
for (int i = 0; i < 5; i++)
stack.push(i);
stack.print();
cout << stack;
while (!stack.empty())
{
stack.pop(val);
cout << val << " ";
}
cout << endl;
}