C++模板学习
一、定义函数模板
template<class T>
函数定义
举个例子比较两个数大小:
template<class T>
int Compare(T a,T b)
{
if(a>b)return ;
if(a<b)return -;
return ;
}
int main()
{
int a=;
int b=;
char c='w';
char d='w';
double e=3.1415;
double f=2.123;
cout<<Compare(a,b)<<endl;
cout<<Compare(c,d)<<endl;
cout<<Compare(e,f)<<endl;
return ;
}
二、定义类模板
template<参数列表>
类定义
1、在定义类模板之前要先说明一个问题,因为这几天把C++中头文件的声明和定义学习了一下。刚好碰到类模板的学习,因此就此小试牛刀。但是这一试让我郁闷呢了好长时间,因为我还是和往常一样把类的声明放在一个*.h的头文件中,具体实现放在*.cpp文件中。但是让我很很很是郁闷的是,构造函数老是编译不能通过老是出现下面这个错误:
error LNK2001: unresolved external symbol "public: __thiscall LinkList<char>::LinkList<char>(void)" (??0?$LinkList@D@@QAE@XZ)
Debug/TemplateLinkList.exe : fatal error LNK1120: 1 unresolved externals
我勒个擦,我最怕这种东西,查阅了好多资料一直没发现是哪有问题,最后终于在今天在网上看到了这篇博文才知道自己C++真是太水了:(http://www.cnblogs.com/tonyyang132/archive/2009/11/12/1601868.html和http://bbs.csdn.net/topics/70471835)
按照C++中代码的惯例,类声明在h文件中,类定义在cpp文件中,相应的成员函数声明也在h文件中,定义在cpp文件中。但是如果这样的架构用在模板函数中,在调用模板函数的地方链接器便会报错,error LNK2001: unresolved external symbol。将定义写在与声明相同的文件中问题解决,解释如下:
“大部分编译器在编译模板时都使用包含模式。也就是一般使用的把模板放到头文件中再包含。
当你不使用这个模版函数或模版类,编译器并不实例化它。当你使用时,编译器需要实例化它。因为编译器是一次只能处理一个编译单元,也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义,所以都放在头文件中。
这不同于普通的函数,在使用普通的函数时,编译时只需看到该函数的声明即可编译,而在链接时由链接器来确定该函数的实体。”
2、在写类模板之前还要注意一点,在类模板作用域内,可以用他的非限定名字引用该类。比如:
#ifndef NODE_H_H
#define NODE_H_H
template<class T>class LinkList;
template<class T>
class Node
{
friend LinkList<T>;
private:
T Data;
Node *Next;//完整为Node<T> *Next;
};
#endif
此处的Node<T> *Next可以写为Node *Next,但是为了保证不出错无论在不在类模板的作用域内都用它的限定名引用该类。还有注意一点假设有一个成员函数返回的是指向该模板类的指针,返回类型也必须为该模板的限定名引用该类。
template <class T>
Node<T> *LinkList<T>::Create(int len)//注意这里的返回值为类模板类型Node<T>
{
Node<T> *p;
Node<T> *temp;
T s;
while(len--)
{
cout<<"输入数据:"<<endl;
cin>>s;
temp=new Node<T>;
temp->Data=s;
temp->Next=NULL;
if (!head)
{
head=temp;
p=head;
}
else
{
p->Next=temp;
p=temp;
}
}
return head;
}
3、因为这里是用类写而且class Node{};成员为私有,因此在class LinkList{};使用Node类的数据成员要在class Node{};声明为friend。
4、贴出完整代码和运行结果。
//Node.h
#ifndef NODE_H_H
#define NODE_H_H
template<class T>class LinkList;
template<class T>
class Node
{
friend LinkList<T>;
private:
T Data;
Node *Next;
};
#endif
/*-------------------------------------------*/
//LinkList.h
#include "Node.h"
#ifndef LINKLIST_H_H
#define LINKLIST_H_H
template<class T>
class LinkList
{
private:
Node<T> *head;
public:
LinkList();
~LinkList();
void Insert(T data);
void printLinkList();
Node<T> *Create(int len);
};
#endif template<class T>
LinkList<T>::LinkList()
{
head=NULL;
} template<class T>
LinkList<T>::~LinkList()
{
Node<T> *p;
while(head)
{
p=head->Next;
delete head;
head=p;
cout<<"析构!"<<endl;
}
}
template <class T>
Node<T> *LinkList<T>::Create(int len)
{
Node<T> *p;
Node<T> *temp;
T s;
while(len--)
{
cout<<"输入数据:"<<endl;
cin>>s;
temp=new Node<T>;
temp->Data=s;
temp->Next=NULL;
if (!head)
{
head=temp;
p=head;
}
else
{
p->Next=temp;
p=temp;
}
}
return head;
}
template<class T>
void LinkList<T>::Insert(T data)
{
Node<T> *p=head;
Node<T> *s=new Node<T>;
s->Data=data;
s->Next=NULL;
if (head==NULL)
{
head=s; }
else
{
while(p->Next)
{
p=p->Next;
}
p->Next=s;
}
} template<class T>
void LinkList<T>::printLinkList()
{
Node<T> *p=head;
while(p)
{
cout<<p->Data<<endl;
p=p->Next; }
}
/*--------------------------------------------------------------------*/
//TemplateLinkList.cpp
#include <iostream>
#include<string>
#include "Node.h"
#include "LinkList.h"
using namespace std; int main()
{
LinkList<char> L;
L.Insert('a');
L.Insert('b');
L.Insert('c');
L.printLinkList(); LinkList<string> s;
s.Insert("abcd");
s.Insert("efgh");
s.Insert("ijkl");
s.printLinkList(); LinkList<int> t;
t.Insert();
t.Insert();
t.Insert();
t.printLinkList(); LinkList<double> d;
Node<double> *b;
b=d.Create();
d.printLinkList(); //Node<int> n;
return ;
}

C++模板学习的更多相关文章
- XTemplate模板学习和使用总结
XTemplate模板学习和使用总结 前言 XTemplate是我接触的第一个模板语言,用在公司的一个NodeJS项目中,跟它打交道经常是因为需要使用它的语法向模板中注入数据.因为是刚入门前端不久 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- C++模板学习随笔
本文学习内容参考:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 1.模板分为函数模板和类模板两种类型 函数模板针 ...
- 模板学习实践二 pointer
c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "s ...
- 算法模板学习专栏之总览(会慢慢陆续更新ing)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- wordpress学习三:wordpress自带的模板学习
在<学习二>里,大概说了下怎么去查找模板,本节我们以一个简单的模板为例子,继续说说wordpress的模板机制,看看做一个自己的模板需要哪些知识点. 页面模板渲染 wordpress的模板 ...
- C++模板学习笔记
一个有趣的东西:实现一个函数print, 输入一个数组, 输出数组的各个维度长度. eg. ], b[][], c[][][]; print(a); //(2, 4) print(b); //(3, ...
- 转:C++模板学习
C++ 模板 转:http://www.runoob.com/cplusplus/cpp-templates.html 2018-01-05 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的 ...
- C++模板学习之优先队列实现
转载:https://www.cnblogs.com/muzicangcang/p/10579250.html 今天将继续将强C++模板类的学习,同时为了巩固已经学习过的数据结构中有关优先队列的知识, ...
随机推荐
- 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 4 Dependent Samples
Stat2.3x Inference(统计推断)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...
- POJ 1236 Network of Schools(强连通分量/Tarjan缩点)
传送门 Description A number of schools are connected to a computer network. Agreements have been develo ...
- Android配置文件,所有权限
访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permiss ...
- Jboss7.1 加入realm auth认证 bootsfaces 美化的登录页面
jboss-as-7.1.1.Final\standalone\configuration: 1, standalone.xml中 <security-domains>标签里面添加: &l ...
- Base64复习
http://www.cnblogs.com/chengxiaohui/articles/3951129.html
- SVN服务器配置说明
1.前 言 花了72小时,终于把 Subversion 初步掌握了.从一个连“什么是版本控制”都不知道的门外汉,到配置出精确至每目录访问的入门者,中间还卡了一天时间.其中费了许多气力,摸索实验了多次, ...
- linux 相关快捷键
linux 相关快捷键 http://linux.chinaunix.net/begin/2004-10-05/34.shtml#_Toc41417098 1.使用虚拟控制台登录后按“Alt+F2”键 ...
- js正则匹配浮点数或整数
var pos='point(12.4 -45.423453)';var re = /([+]\d+[.]\d+|[-]\d+[.]\d+|\d+[.]\d+|[+]\d+|[-]\d+|\d+)/i ...
- BigDecimal类
如果需要精确的计算结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作. //========================================== ...
- Unity Particle System Sorting Order
http://answers.unity3d.com/questions/577288/particle-system-rendering-behind-sprites.html