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++模板类的学习,同时为了巩固已经学习过的数据结构中有关优先队列的知识, ...
 
随机推荐
- git远程分支
			
1. 同步远程服务器上的数据到本地 git fetch origin 2. 添加远程分支 git remote add teamone git://git.tram1.ourcompany.com 添 ...
 - 初识JSLint及建议JS编码风格
			
可能都或多或少的知道JSLint是一个JavaScript的代码质量工具,一个JavaScript语法检查器和校验器,它能分析JavaScript问题并报告它包含的缺点. 被发现的问题往往是语法错误, ...
 - shell 中 &&和||的方法
			
Shell && 和 || shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中.当 $? == 0 时,表示执行成功:当 $? == 1 时 ...
 - python学习2 lambda表达式
			
学习C#的,对这个就特别熟悉了 lambda函数,它没有名字,只有参数和表达式: lambda args: expression def func1(func,arg): return func(a ...
 - MinGW: TOO MANY SECTIONS issue
			
http://sourceforge.net/p/mingw-w64/mailman/mingw-w64-public/thread/509A38C6.6070807@doxos.eu/ MingGW ...
 - JS,JQ点击事件
			
1.点击显示,再次点击隐藏 $("#pingfen-click").click(function(){ name = document.getElementById("p ...
 - SCWS分词扩展在UNIX/LINUX下的安装方法
			
<?php/** * 中文分词处理方法 *+--------------------------------- * @param stirng $string 要处理的字符串 * @param ...
 - Effective Objective-C 2.0 — 第9条:以“类族模式”隐藏实现细节
			
第9条:以“类族模式”隐藏实现细节 类族模式可以把实现细节隐藏在一套简单的公共接口后面 系统框架中经常使用类族 从类族的公共抽象基类中继承子类时要当心,若有开发文档,则应首先阅读 “类族”(class ...
 - dom.style.left 与 dom.offsetLeft区别
			
dom.style.left 初始空值,必须在html行内样式定义值才有值,在css样式定义仍为空值 可读写,是字符串,读写是必须加px,否则无效 ...
 - (转载)MySQL数据类型:TINYINT, SMALLINT, MEDIUMINT, INT, INTEGER等字段类型区别
			
(转自http://3y.uu456.com/bp-f088f739376baf1ffc4fad40-1.html) MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型.字符串(字 ...