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++模板类的学习,同时为了巩固已经学习过的数据结构中有关优先队列的知识, ...
随机推荐
- Simultaneous Tag Editing in IntelliJ IDEA 14.1
If you're involved in web development and, for some reason, you haven't given a ride to IntelliJ IDE ...
- 安装PhantomJS
安装步骤 # 安装依赖软件 yum -y install wget fontconfig # 下载PhantomJS wget -P /tmp/ https://bitbucket.org/ariya ...
- AngularJs ngIf、ngSwitch、ngHide/ngShow
在组合这些ng指令写到一篇文章里的时候,基本是有规则的,本兽会将功能相似相近的一类整合到一篇文章,方便理解和记忆. 这篇的三个指令也都是对DOM元素的操作,页面上显示/隐藏的判断,添加/移除的判断. ...
- 通往WinDbg的捷径(二)
原文:http://www.debuginfo.com/articles/easywindbg2.html译者:arhat时间:2006年4月14日关键词:CDB WinDbg 保存 dumps 在我 ...
- CentOS设置默认启动命令行(不启动图形界面)
Linux 启动的时候可以选择纯文本或者是窗口环境,这就牵涉了运行等级这个问题.Linux 默认提供了 7 个 Run level 给我们使用,其中我们最常用的就是 run level3 和run l ...
- 强大的css3
强大的css3 我们知道,这几年来智能手机的高速发展使得人们使用移动端上网的时间和人数已经超过了PC端.例如在2015年,就中国电商而言,各电商平台在移动端持续发力,移动端购物占比不断攀升,双11期间 ...
- 机器学习笔记--KNN算法1
前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...
- Android应用内语言切换实现(转)
使用Java反射机制 IActivityManager与ActivityManagerNative都是非公开类,使用Java反射去调用其中的方法. 第一步.使用Android开放的api更改Confi ...
- 关于datatable linq的转换
关于datatable datarow DataTable paraval = GetParaVal(DateCondition, strUrl, Page, RowPage, iYearMonthN ...
- _mkdir
[内容摘要]: C语言 在VS2013环境下使用_mkdir返回值是-,而且文件夹不存在,#include stdio.h#include direct.hmain(){)printf("无 ...