Chinaunix首页 | 论坛 | 博客
  • 博客访问: 433143
  • 博文数量: 138
  • 博客积分: 4114
  • 博客等级: 上校
  • 技术积分: 1341
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-14 20:41
文章分类

全部博文(138)

文章存档

2014年(1)

2013年(2)

2012年(78)

2011年(13)

2010年(34)

2009年(10)

我的朋友

分类: LINUX

2010-04-21 15:47:33

对template一直不是很明白,今天看到这篇文章,感觉明白点了,但是还没有达到我想要的程度

http://blog.sina.com.cn/s/blog_49620a890100fv03.html

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 );   
    
   该头文件可以被包含在许多程序文本文件中。这意味着编译器必须在每个调用该实例的文件中实例化min()的整型实例吗?不。该程序必须表现得好像 min()的整型实例只被实例化一次。但是,真正的实例化动作发生在何时何地,要取决于具体的编译器实现。   
    
二、分离编译模式   
   在分离编译模式下,函数模板的声明被放在头文件中。在这种模式下,函数模板声明和定义的组织方式与程序中的非内联函数的声明和定义组织方式相同。如:

// 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':
user.cpp:(.text+0xa6): undefined reference to `int my_max(int, int)'
collect2: ld returned 1 exit status "

连提示  export 没有支持都没有, 不知道为什么, 你知道吗?

     
三、显式实例化声明   
   标准C++提供了显式实例化声明来帮助程序员控制模板实例化发生的时间。在显式实例化声明中,关键字template后面是函数模板实例的声明,其中显式 地指定了模板实参。下例中提供了sum(int* , int)的显式实例化声明:

template
Type sum( Type op1, int op2 ) {} // 函数模板sum的定义必须给出
// 显式实例化声明
template int* sum< int* >( int*, int );   
    
    该显式实例化声明要求用模板实参int*实例化模板sum()。对于给定的函数模板实例,显式实例化声明在一个程序中只能出现一次。

PS:   什么时候有机会了,想看看c++编译器是如何实现模板的。

    


阅读(1550) | 评论(0) | 转发(0) |
0

上一篇:C/C++ 编译过程理解

下一篇:singleton练习

给主人留下些什么吧!~~