5D空间
学习总结与经验交流
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
(18)
解题报告
(rss)
困难与疑问(3)
(rss)
思考中
(rss)
我的开源库(5)
(rss)
学习笔记(10)
(rss)
文章分类
5DC++
(rss)
转载与分享
(rss)
搜索
积分与排名
积分 - 18115
排名 - 864
最新随笔
1. C++中对浮点数的格式化显示
2. PointerPool(指针池)
3. 类型转换操作符
4. VS2010实用小记
5. 关于二重模板 小记1
6. 模板的声明与实现的分离方法
7. 多重继承、二义性、虚基类(虚继承)之我见
8. LHRODT(非递归求解度数为2的线性齐次方程的第n项)
9. 类实例化时 默认构造函数调用 小记
10. probability(概率发生器)
11. findAnWithDegreeOfTwo(计算度数为2的齐次递归数列的第n项)
12. Zeller(计算某一天是星期几)
13. 【求助】如何在继承中隐藏基类的某些公共接口?
14. 【求助】如何限制模板接受的类型?
15. 关于类模板的友元函数
最新评论
1. re: 【求助】如何在继承中隐藏基类的某些公共接口?
评论内容较长,点击标题查看
--wjq
2. re: 【求助】如何在继承中隐藏基类的某些公共接口?
在派生类中使用using关键字,在private中声明基类你想隐藏的公共接口就可以了。
--wjq
3. re: 多重继承、二义性、虚基类(虚继承)之我见
可以啊,自慰.@自己继承自己
--CL
4. re: 多重继承、二义性、虚基类(虚继承)之我见
孩子,代码打错了。
class C : public C
自己继承自己?
--自己继承自己
5. re: probability(概率发生器)
逗号 表达式
从左到右计算,然后只取最后一个值....
--egmkang
阅读排行榜
1. 多重继承、二义性、虚基类(虚继承)之我见(3404)
2. 模板的声明与实现的分离方法(2114)
3. PointerPool(指针池)(1827)
4. probability(概率发生器)(1453)
5. 关于二重模板 小记1(1306)
关于二重模板 小记1
摘要:二重模板有什么用,什么情况下使用二重模板,对二重模板进行的某种特化进行重载,=以及拷贝构造函数在二重模板中的注意事项
小记1是因为这个话题很可能还有其他小记。
在模板下定义一个类,类的方法包括重载的运算符往往可以处理这个类模板对于相同类型参数的特化的对象。但是有时候我们往往希望一个类模板的特化对象的方法还可以处理这个类模板其他特化的对象。一种办法是利用类的性质定义转换构造函数(convert constructor ),但是我们可以使用模板得到一种更通用的方法,那就是在类模板中定义二重模板。
定义方法很简单,下面的例子会展示。注意内层模板的参数应该与外层模板不一样,而且定义的时候应该使用两层template。
对于一般的函数和运算符,通常来说,如果只定义一个二重模板的方法,它既可以处理不同类型的特化对象,也可以处理相同类型的特化对象(即T和C是相同类型)。如果在外层模板中另外定义了一个普通的同名方法(以处理相同类型的特化对象),那么在处理相同类型的特化对象时,则会调用这一套方法。这有点像对模板特化进行重载(告诉编译器在特殊情况,这里是特化类型相同,应该使用另外一套方法)。
例如:
如果把8行和14~18行注释掉,那么输出结果均为两行 接受不同类型。
1
#include
<
iostream
>
2
using
namespace
std;
3
4
template
<
typename T
>
5
class
A
6
{
7
public
:
8
void
function(
const
A
<
T
>
&
);
9
10
template
<
typename C
>
11
void
function(
const
A
<
C
>
&
);
12
}
;
13
14
template
<
typename T
>
15
void
A
<
T
>
::function(
const
A
<
T
>
&
)
16
{
17
cout
<<
"
接受相同类型
"
<<
endl;
18
}
19
20
template
<
typename T
>
21
template
<
typename C
>
22
void
A
<
T
>
::function(
const
A
<
C
>
&
)
23
{
24
cout
<<
"
接受不相同类型
"
<<
endl;
25
}
26
27
int
main()
28
{
29
A
<
int
>
a;
30
A
<
int
>
b;
31
A
<
double
>
c;
32
33
a.function( b );
34
a.function( c );
35
}
但是对于复制操作符和拷贝构造函数来说,情况有些不一样。因为编译器会为没有定义的类提供默认=以及拷贝构造函数,根据上面的分析,这个默认的东西相当于对二重模板中特殊情况的重载,所以如果只有一个二重模板,那么它将不能处理相同类型的类模板特化的对象。而这时,程序会调用编译器提供的默认=以及拷贝构造函数,而这往往是我们不想要的(我们需要自己定制的=以及拷贝构造函数啊)。所以这时,我们需要自己定制一套非二重模板的=或者拷贝构造函数来满足需求。
例如:
如果把8行和14~18行注释掉,那么输出结果只有一行 为不同类型调用=号 ,因为另外一句话调用了编译器提供的默认=号,所以并没有任何输出。
1
#include
<
iostream
>
2
using
namespace
std;
3
4
template
<
typename T
>
5
class
B
6
{
7
public
:
8
void
operator
=
(
const
B
<
T
>
&
);
9
10
template
<
typename C
>
11
void
operator
=
(
const
B
<
C
>
&
);
12
}
;
13
14
template
<
typename T
>
15
void
B
<
T
>
::
operator
=
(
const
B
<
T
>
&
)
16
{
17
cout
<<
"
为相同类型调用=号
"
<<
endl;
18
}
19
20
template
<
typename T
>
21
template
<
typename C
>
22
void
B
<
T
>
::
operator
=
(
const
B
<
C
>
&
)
23
{
24
cout
<<
"
为不同类型调用=号
"
<<
endl;
25
}
26
27
int
main()
28
{
29
B
<
int
>
a;
30
B
<
int
>
b;
31
B
<
double
>
c;
32
33
a
=
b;
34
a
=
c;
35
}
posted on 2011-04-05 13:50
今晚打老虎
阅读(1306)
评论(0)
编辑
收藏
引用
所属分类:
学习笔记
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
C++中对浮点数的格式化显示
类型转换操作符
VS2010实用小记
关于二重模板 小记1
模板的声明与实现的分离方法
多重继承、二义性、虚基类(虚继承)之我见
类实例化时 默认构造函数调用 小记
关于类模板的友元函数
关于运算符重载的一些笔记
最简短的鹦鹉学舌程序
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 今晚打老虎