Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163745
  • 博文数量: 19
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 722
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-12 14:11
个人简介

而立之年,一事无成。

文章分类

全部博文(19)

文章存档

2016年(1)

2014年(4)

2013年(14)

我的朋友

分类: C/C++

2013-05-09 13:22:39

模板类在Android和WebRTC源码中很常见,比如RefBase.h中的
template
class wp
{
};
类可以有模板成员函数,也就是说成员函数带有模板参数,它和这里探讨的模板类的声明方式不一样。比如:
class A
{
template >
void func(T);
};
好了,言归正传。通常看到的模板类的头文件里,是带有实现的。但如果尝试把实现放到cpp文件里,会产生链接错误,一般提示函数symbol找不到。
我感觉这个错误是编译器的缺陷。用cpp来实现h是绝对没有问题的,但唯独对模板类行不通,这让人很费解。
经过一番尝试,我发现类的模板函数也有这样的link问题。
所以,从现象里总结一下:
A.h定义列模板类,A.cpp实现模板类,B.cpp包含了A.h实例化了模板类,于是会有链接错误。
但如果把A.cpp里的实现挪到A.h中,链接错误消失。
于是,我有了一个担心,把实现放到头文件中,这样如果多个源文件包了该头文件,会不会造成重复定义的问题,类似于全局变量/全局函数放到头文件里极易产生重定义错误一样?
事实证明不会的。因为类的定义本质上只是一种类型定义,没有实例化也就没有产生地址分配。这是我的理解啦。
以后,用到模板的地方,不要把定义跟实现分开,让h文件搞定一切。
阅读(1736) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~