C++模板应用——让模板定义和实现分离的方法

关于c++中类的模板 ,惯常的用法都是把实现和定义放在头文件里了事。这样的问题是,加大了头文件的长度,减低了模板代码的可读性,还有就是破坏了面向对象的隐藏实现的规则。下面就是这种问题的两个解决方案的总结(取自codeproject http://www.codeproject.com/cpp/templatesourceorg.asp):

假设模板代码如下:

//  模板定义 a.h
#include  < stdio.h >

template 
< class  tType >
class  TTEST
{
     
private:
        tType i ;
     
public:
        
void output();
}
 ;

//  模板实现 a.cpp
#include  " a.h "

template
< class  tType >
void  TTEST < tType > ::output()
{

      printf(
"output: ") ;
}


//  调用模块 test.cpp
#include  " a.cpp "

int  main()
{
     TTEST
<int> t ;
     t.output();
     
return 1 ;
}

注意调用模块test.cpp中,不要包含头文件a.h直接包含a.cpp,这样就能够编译成功。这是由于编译器要建立 TTEST<int> 这个类型需要模板实现,但从头文件里没找到,所以它会认为实现在其它编译单元中,但它不会报错,而把找实现部分的工作留给了linker。linker同样也是找不到实现,因此就不能生成TTEST<int>。上述第一种解决方法 直接包含了实现文件,让compiler直接找到定义和实现,这样的效果跟把定义和实现都放在a.h里是一样的
第二中方法,类似第一种,只是test.cpp只包含a.h,然后新增一个文件impl.cpp内容如下:
//  impl.cpp

#include 
" a.cpp "

template 
class  TTEST < int >  ;

如此一来,也能达到定义与实现分离的目的。只是也要包含a.cpp,另外随着模板实例化不同的类型,impl,cpp中的类型也要跟着改变,有点笨拙的方法。

以上代码在gcc 3.4.4中编译通过。

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值