1.对于T是自定义类型的,如果存在子类型则需要在模版内部加上typename

示例代码:

template<typename T>
class Myclass
{
typename T::SubType *ptr;//需要加上typename不然编译器可能误解为是静态对象SubType和ptr相乘
};

2.类模版里对基类成员函数的调用使用BASE::exit();和this->,避免调用的是外部全局函数,但是在vc6.0上面这条规则是先调用的BASE里面的函数。

示例代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std; void exit()
{
cout << "hello world" <<endl;
}
template <typename T>
class BaseMyclass
{
public:
void exit()
{
cout << "Base" <<endl;
}
}; template <typename T>
class Myclass:public BaseMyclass<T>
{ public: void foo()
{
exit();
}
}; int main()
{
Myclass<int> m1;
m1.foo(); return 0;
}

3.成员模板,由于两种不同的类型之间的赋值不能使用类本身的接口,所以需要重新设计接口。

示例代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std; template <typename T>
class Stack
{
public:
template <typename T2>
Stack<T>& operator=(Stack<T2> const &);
};
template <typename T>
template <typename T2>
Stack<T>& Stack<T>::operator=(Stack<T2> const &op2)
{ } int main()
{ return 0;
}

调用时首先通过显式指定的模板类型实例化一个类,然后通过实例化一个成员函数,只是现在的成员函数是模板函数,然后根据调用的参数实例化成一个成员函数。

4.模板的模板参数,实际上是一个模板类,上面的成员模板实际上是一个模板函数。

代码示例:

template <typename T,template<typename T> class CONT = vector>
class Stack
{
public: };

5.零初始化,因为模板不知道类型所以我们无法用任何一个常量来初始化模板参数定义的变量。但是可以如下例子进行初始化

代码示例:

#include <iostream>
#include <string>
#include <vector>
using namespace std; template <typename T>
void foo()
{
T x = T();
} template <typename T>
class Myclass
{
private:
T x;
public:
Myclass():x(T()){}
}; int main()
{
foo<int>();
Myclass<int> m1;
return 0;
}

6.使用字符串作为函数模板的实参若是引用则需要字符串长度完全匹配

示例代码:

template <typename T>
inline T& const max(T const& a,T const& b)
{
return a > b ? a:b;
} int main()
{
cout << max("apple","peach")<<endl;//OK
cout << max("apple","tomato")<<endl;//ERROR
return 0;
}

若不为引用则不需要字符串长度完全一样,原因是参数会转换成字符串指针类型,属于相同的类型

示例代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std; template <typename T>
inline T max(T a,T b)
{
return a > b ? a:b;
} int main()
{
cout << max("apple","peach")<<endl;//OK
cout << max("apple","tomato")<<endl;//OK
return 0;
}

字符串作为实参的测试示例:

template <typename T>
void ref(T const& x,T const& y)
{
cout << "x int the ref is " << typeid(x).name() <<endl;
} template <typename T>
void nonref(T x)
{
cout << "x int the noref is " << typeid(x).name() <<endl;
}
int main()
{
ref("hello");
nonref("hello"); return 0;
}

C++ Template之技巧性基础知识的更多相关文章

  1. java基础知识 多线程

    package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...

  2. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

  3. C++ 顺序容器基础知识总结

    0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...

  4. WPF基础知识、界面布局及控件Binding(转)

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  5. WPF基础知识、界面布局及控件Binding

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  6. 浅析C++基础知识

    近期想对C++的面试题目进行一下更加详细的整理.事实上认真思考一下C++程序猿的面试,我们能够发现对程序猿的能力的考察总是万变不离当中,这些基础知识主要分为五部分:一. C/C++基础知识 二. C/ ...

  7. 【流量】netflow 基础知识

    摘要 记录下关于netflow的基础知识以及应用,现状 是什么 一种数据交换方式,NetFlow流量统计数据包括数据流时戳 源IP地址和目的IP地址 源端口号和目的端口号 输入接口号和输出接口号 下一 ...

  8. Vue.js-08:第八章 - 组件的基础知识

    一.前言 在之前的学习中,我们对于 Vue 的一些基础语法进行了简单的了解,通过之前的代码可以清晰的看出,我们在使用 Vue 的整个过程,最终都是在对 Vue 实例进行的一系列操作. 这里就会引出一个 ...

  9. 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性

    [源码下载] 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) 自定义控件 ...

随机推荐

  1. mysql 排重查询

    GROUP BY 语句可以实现某一列的去重查询. 直接上语句: select io_dev_id from io_info where (TID=1 AND host_name='yang1') GR ...

  2. LotusPhp入口文件解析

    LotusPhp也是单入口的框架,可以根据需要开启多个应用实例 例如前台页面可以用index.php作为入口文件,后台可以用admin.php作为入口文件,多个应用实例可以共享应用配置和类库或者根本每 ...

  3. ubuntu 12.04 LTS(64位)安装apache2

    在网上找了很多文章,说法不一,不知道应该用哪种方法,后来想就用其中最简单的吧,装不好再卸了重装, 然后就...装上了,用的是tar包源码安装,下面是步骤 1.去官网下载apache2.2.25源码包, ...

  4. C++读入一个参数

    题目内容:已知正方形的边长,试编程求出其面积. 输入描述:输入不超过50个正整数的数据n(1<=n<=10000),每个正整数间以空格隔开. 输出描述:每次读入一个正整数,便输出其正方形的 ...

  5. Jquery note

    the purpose: write less. do more   写得少,做更多 jquery 基本选择器, $("p ,div ")匹配所有的P元素和DIV元素 , $(&q ...

  6. 访问svc 文件,编译器错误消息: CS0016,未能写入输出文件

    编译错误              说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码.             编译器错误消息: CS0016: 未 ...

  7. Perl 随机数和随机密码的产生

    Perl有着强大的随机数产生函数rand(),下面的代码详细介绍其应用 #!/usr/bin/perl #  use strict;   use warnings; # 0~1之间    $rando ...

  8. rails bug

    variable @fontAwesomeEotPath_iefix is undefined rails generate bootstrap:install如果还有错,保证在加载主提之前impor ...

  9. 1084. Broken Keyboard (20)

    On a broken keyboard, some of the keys are worn out. So when you type some sentences, the characters ...

  10. AppCan教你从零开始做开发

    经常收到类似这样的提问:新手开发APP,要怎么学?我有满屏幕的文档和视频,然而并没有什么卵用,因为我不知道该从哪看起……今天的主要内容是教大家,如何在AppCan移动平台创建应用,引擎插件选择.证书管 ...