C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化
模板类模板成员函数(member function template)隐式处理(implicit)变化
本文地址: http://blog.csdn.net/caroline_wendy/article/details/24233693
指针支持隐式转换(implicit conversion), 在动态绑定中,派生类指针能够转换为基类指针.
可是模板的实例化(instantiations)之间, 是单独存在的,
派生类的实例化的模板(SmartPtr<Derived>),
不能转换为基类实例化的模板(SmartPtr<Base>);
须要明白的编写, 由于派生类也能够继续做为基类, 产生派生类, 所以无法直接写出构造函数.
使用成员函数模板(member function template), 再声明一个模板參数, 提供这样的隐式转换.
为了使用转换仅仅能发生在能够转换的指针, 如"Derived->Base", 不能逆序, 所以引入相关约束推断能否够转换.
在成员初始化列表(member initialization list)中调用get()函数, 推断能否够隐式转换.
使用成员函数模板的构造函数, 是成员函数的一种, 并非重载复制构造函数, 所以类会自己主动生成一个默认构造函数.
代码注意: 第一个能够转换, 第二个不能转换, 第三个使用默认的构造函数.
代码:
/*
* test.cpp
*
* Created on: 2014.04.20
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> using namespace std; class Base{}; class Derived : public Base {}; template<typename T>
class SmartPtr {
public:
SmartPtr() = default;
template<typename U>
SmartPtr(const SmartPtr<U>& other)
: heldPtr(other.get()) {
std::cout << "SmartPtr:CopyConstructor" << std::endl;
}
T* get() const {return heldPtr;}
private:
T* heldPtr;
}; int main() { SmartPtr<Derived> spd;
SmartPtr<Base> spb(spd); //SmartPtr<Base> spb1;
//SmartPtr<Derived> spd1(spb1); //无法进行隐身转换 SmartPtr<Base> spd2;
SmartPtr<Base> spd21(spd2); //使用默认的复制构造函数
return 0;
}
输出:
SmartPtr:CopyConstructor
版权声明:本文博客原创文章。博客,未经同意,不得转载。
C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化的更多相关文章
- C++ 类的成员函数指针 ( function/bind )
这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...
- 类的成员函数指针和mem_fun适配器的用法
先来看一个最简单的函数: void foo(int a) { cout << a << endl; } 它的函数指针类型为 void (*)(int); 我们可以这样使用: v ...
- c++函数模板作为类的成员函数,编译报错LNK2019的解决方法
为了使某个类的成员函数能对不同的参数进行相同的处理,需要用到函数模板,即template<typename T> void Function(). 编译时报错LNK2019 解决方法: 1 ...
- C++函数模板&类模板
函数模板 模板概念及语法 主要目的,简化代码,减少重复代码.基本语法格式: template<class T> 或者 template<typename T> //末尾不加分 ...
- C++ 函数模板&类模板详解
在 C++ 中,模板分为函数模板和类模板两种.函数模板是用于生成函数的,类模板则是用于生成类的. 函数模板&模板函数 类模板&模板类 必须区分概念 函数模板是模板,模板函数时 ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- C++ 11 线程调用类的成员函数解决办法
在C++中,_beginthreadex 创建线程是很麻烦的.要求入口函数必须是类的静态函数. 通常,可以采用thunk,或者模板来实现. 因C++ 11中引入了 std::async ,可以很好的解 ...
- C++类的成员函数(在类外定义成员函数、inline成员函数)
类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...
- VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)
一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...
随机推荐
- T-SQL技术收集——删除重复数据
原文:T-SQL技术收集--删除重复数据 在工作和面试中,经常出现如何查询或者删除重复数据的问题,如果有主键,那还好办一点,如果没有主键,那就有点麻烦. 当一个表上没有辅助键时,如果使用SSMS界面来 ...
- Unity3d 导入图像尺寸失真解决方案
导入到unity3d内的图像被默认长宽变换为满足2^n关系. 例如以下图,我有张图片名称为984plus598表示我尺寸为984*598.拷贝到unity3d中后的大小为1024*512 方法一: 在 ...
- 深入了解C++中间mutablekeyword
深入理解C++中的mutablekeyword kezunhai@gmail.com http://blog.csdn.net/kezunhai keywordmutable是C++中一个不 ...
- 三款经常使用IP发包工具介绍
AntPower 版权全部© 2003 技术文章http://www.antpower.org 第1 页共14 页AntPower-技术文章三款经常使用IP 发包工具介绍小蚁雄心成员郎国军著lgj@q ...
- myeclipse解决JSP文件script调整背景颜色
1进口MyEclipse主题后,打开jsp要么html文件,jsvascript部分原因遭遇了一层白色的.闪避这个时候.症状,如下面: watermark/2/text/aHR0cDovL2Jsb2c ...
- Linux内核导出符号宏定义EXPORT_SYMBOL源代码分析
资源: <include/linux/moudule.h> --. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX &q ...
- $.ajax()详解
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- poj 3400 Dropping the stones
//next_permutation全阵列 # include <stdio.h> # include <algorithm> # include <string.h&g ...
- C在宏定义中使用的语言可变参数
于C标准库的语言,printf.scanf.sscanf.sprintf.sscanf入输出函数,參数都是可变的.在调试程序时.我们可能希望定义一个參数可变的输出函数来记录日志,那么用可变參数的宏是一 ...
- linux_增加用户组_删除用户
添加账号组 /usr/sbin/groupadd iknow 添加账号 /usr/sbin/useradd -g iknow -d /home/iknow/ iknow 更改密码 passwd 选项 ...