微软定义函数模板特化-编译时的重定义错误

新手发帖,很多方面都是刚入门,有误错的地方请大家见谅,欢迎批评指正

Issue:
在函数模板特化的过程当中, 编译时到遇多重定义的误错; (VC2010和g++)

以下是一个特化的例子:

template <class T>
T maxA( T t1, T t2 ) {
    return (t1 > t2 ? t1 : t2);
}
//特化 specialize
typedef const char *PCC;
template<> PCC maxA< PCC >( PCC s1, PCC s2 ) {
    return ( strcmp( s1, s2 ) > 0 ? s1 : s2 );
}

1)如果这段代码是添加在main.cpp里头, 没有问题, 编译通过;

2)如果这段代码添加到头文件, e.g. test.h中, 辑编阶段就会有多重定义的error;


Solution:

a) 将函数模板的特化声明在头文件中,定义放在cpp中;

//header-test.h
template <class T>
T maxA( T t1, T t2 ) {
    cout<<"Base"<<endl;
    return (t1 > t2 ? t1 : t2);
}
//特化 specialize
typedef const char *PCC;
template<> PCC maxA< PCC >( PCC s1, PCC s2 ) ;
//implement
//test.cpp
template<> PCC maxA< PCC >( PCC s1, PCC s2 ) {
    cout<<"Spec"<<endl;
    return ( strcmp( s1, s2 ) > 0 ? s1 : s2 );
}

b) 把特化的函数声明为inline;

template <class T>
T maxA( T t1, T t2 ) {
    cout<<"Base"<<endl;
    return (t1 > t2 ? t1 : t2);
}
//特化 specialize
typedef const char *PCC;
template<>
inline PCC maxA< PCC >( PCC s1, PCC s2 ){
    cout<<"Spec"<<endl;
    return ( strcmp( s1, s2 ) > 0 ? s1 : s2 );
}


Reason: 
The full specialization is no longer a template. It's a concrete function.
函数模板全特化后不再是一个模板, 它成为了一个函数的现实;
如果在头文件中全特化函数模板, 就好象在头文件中多次定义了同一个函数, 编译器就抓狂了.


<refer to> http://stackoverflow.com/questions/4446968/template-specialization-multiply-defined-symbols

    每日一道理
微笑,是春天里的一丝新绿,是秋日里的一缕阳光,是骄阳下的一片浓荫,是冬雪中的一株梅红……微笑着去面对吧,你会感到人生是那样的温馨与甜蜜!

用户论评

暂无论评。
表发论评:
提交

文章结束给大家分享下程序员的一些笑话语录: PC软件体积大,是因为一个PC软件功能往往较多,能够满足你一个方面的需求,而一个iphone软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值