C++的模板使用:
转载博客:C++模板学习
在这一篇博客里很详细的说明的模板的使用,使用模板可以不用函数重载就传入各种类型的参数,大大节省的代码量,但有些点需要注意。
值得注意的地方:
1、使用模板创建结构体后,使用结构体声明、创建变量时必须指定所需的类型
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
template <typename T>
struct Node{
T data;
Node<T> *lchild;
Node<T> *rchild;
};
int main(){
Node<int> x; //需要指定类型
x.data = 100;
return 0;
}
在声明Node变量的时候指定了类型为<int> ,如果不指定类型将会报错
2、每次利用模板声明函数、结构体的时候,都需要声明模板
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef int I;
template <class T>
struct SNode{
T data;
SNode<T> *next;
};
template <class T>
void visit(SNode<T> *p){
cout << p->data << endl;
}
template <class T>
void inistack(SNode<T> *&lst){
lst = NULL;
}
template <class T>
int isEmpty(SNode<T> lst){
if(lst->next == NULL)
return 1;
else
return 0;
}
template <class T>
void push(SNode<T> *&lst, T x){
SNode<T> *p ;
p = (SNode<T> *)malloc(sizeof(SNode<T>));
p->next = NULL;
p->data = x;
p->next = lst;
lst = p;
}
template <class T>
int pop(SNode<T> *&lst, T &x){
SNode<T> *p;
if(lst == NULL)
return 0;
p = lst;
\\cout << " pop: " << p->data <<endl;
x = p->data;
lst = p->next;
free(p);
return 1;
}/**/
SNode<int> *sta;
sta = (SNode<int>*)malloc(sizeof(SNode<int>));
int x = 100;int a=10;
int c ,m;
push(sta, x);
visit(sta);
push(sta, a);
visit(sta);
pop(sta,m);
visit(sta);
pop(sta,c);
cout << "a: " << m << " x: " << c << endl;
/**/
return 0;
}
笔者的本意是利用模板创建一个链栈,以及链栈的一些基本操作函数,结果有点弄巧成拙的意味,如此并不见得高效多少,但无意中发现每声明一个函数,都需要声明模板,否则将会报错。
错误代码示范:
template <class T>
struct SNode{
T data;
SNode<T> *next;
};
\\template <class T>
void visit(SNode<T> *p){
cout << p->data << endl;
}
这里系统将会报错
3、template不支持使用typedef
template <typename T>
typedef struct Node{
T data;
Node<T> *lchild;
Node<T> *rchild;
} ;
这样系统将报错,template declaration of “typedef”
总结:
使用模板在一定程度上可以大大节约代码量,但是有一些需要注意的点,这是笔者在使用时遇到的问题,如果有何错误或更好的解决方法,请大家指导