分类: LINUX
2010-04-21 15:47:33
C++中模板的声明和定义的位置一定要小心处理, 否则在链接时会出现"无法解析某某函数或类"的错误.
一、包含编译模式
// model1.h
// 包含模式:模板定义放在头文件中
template
Type min( Type t1, Type t2 )
{
return t1 < t2 ? t1 : t2;
}
在每个使用min()实例的文件中都包含了该头文件,如:
// 在使用模板实例之前包含模板定义
#include "model1.h"
int i, j;
double dobj = min( i, j
);
二、分离编译模式
// model2.h
// 分离模式:只提供模板声明
template Type min( Type t1, Type t2 );
// model2.cpp
// 模板定义
export template
Type min( Type t1, Type t2 ) {}
使用函数模板min()实例的程序只需在使用该实例之前包含这个头文件:
// user.c
#include "model2.h"
int i, j;
double d = min( i, j ); // OK:
用法,需要一个实例
通过在模板定义中的关键字template之前加上关键字export,来声明一个可导出的函数模板。
但是export关键字并非所有的编译器都支持的, 譬如微软的VC++6编译器就不支持, 只是报告说"warning C4237:
'export' keyword is not yet supported, but reserved for future
use".
ps: 我在g++ 4.1 + redhat 的环境下测试,得到的结果是
" /tmp/ccLQmvVr.o: In function `main':连提示 export 没有支持都没有, 不知道为什么, 你知道吗?
三、显式实例化声明
template
Type sum( Type op1, int op2 ) {} // 函数模板sum的定义必须给出
// 显式实例化声明
template int* sum< int* >( int*, int
);
PS: 什么时候有机会了,想看看c++编译器是如何实现模板的。