一、定义函数模板

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.htmlhttp://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++模板学习的更多相关文章

  1. XTemplate模板学习和使用总结

    XTemplate模板学习和使用总结 前言   XTemplate是我接触的第一个模板语言,用在公司的一个NodeJS项目中,跟它打交道经常是因为需要使用它的语法向模板中注入数据.因为是刚入门前端不久 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. C++模板学习随笔

    本文学习内容参考:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 1.模板分为函数模板和类模板两种类型 函数模板针 ...

  4. 模板学习实践二 pointer

    c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "s ...

  5. 算法模板学习专栏之总览(会慢慢陆续更新ing)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  6. wordpress学习三:wordpress自带的模板学习

    在<学习二>里,大概说了下怎么去查找模板,本节我们以一个简单的模板为例子,继续说说wordpress的模板机制,看看做一个自己的模板需要哪些知识点. 页面模板渲染 wordpress的模板 ...

  7. C++模板学习笔记

    一个有趣的东西:实现一个函数print, 输入一个数组, 输出数组的各个维度长度. eg. ], b[][], c[][][]; print(a); //(2, 4) print(b); //(3, ...

  8. 转:C++模板学习

    C++ 模板 转:http://www.runoob.com/cplusplus/cpp-templates.html 2018-01-05 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的 ...

  9. C++模板学习之优先队列实现

    转载:https://www.cnblogs.com/muzicangcang/p/10579250.html 今天将继续将强C++模板类的学习,同时为了巩固已经学习过的数据结构中有关优先队列的知识, ...

随机推荐

  1. RBM Formula Deduction

    Energy based Model the probability distribution (softmax function): \[p(x)=\frac{\exp(-E(x))}{\sum\l ...

  2. 高可用与负载均衡(7)之聊聊Lvs-DR+Keepalived的解决方案

    今天直接开门见山了,直接说配置吧.首先介绍下我这的环境 如有问题,请联系我18500777133@sina.cn IP 安装软件 192.168.1.7 lvs1+keepalived master角 ...

  3. RMQ模板

    RMQ:范围最小值问题.给出一个n个元素的数组A1,A2,...,An,设计一个数据结构支持查询操作Query(L,R):计算min{AL,AL+1,...,AR}. 每次用一个循环来求最小值显然不够 ...

  4. python不同模式打开文件的完全列表

    模式 描述 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针将会放在文件的开头.这是默认模式. r+ 打开一个文件用于读写.文件指 ...

  5. Notepad++ 开启「切分窗口」同时检视、比对两份文件

    Notepad++ 是个相当好用的免费纯文本编辑器,除了内建的功能相当多之外,也支持外挂模块的方式扩充各方面的应用.以前我都用 UltraEdit 跟 Emeditor,后来都改用免费的 Notepa ...

  6. uC/OS-II核心(Os_core)块

    /*************************************************************************************************** ...

  7. Java 毫秒转换为日期类型、日期转换为毫秒

    /毫秒转换为日期 public static void main(String[] args) { DateFormat formatter = new SimpleDateFormat(" ...

  8. SQL 操作语句

    SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; --all 查询所有 ...

  9. re正则表达式7_{}

    curly brackets {} instead of one number, you can specify a range by writing a minimum,a comma,and a ...

  10. logo上传