新手发帖,很多方面都是刚入门,有误错的地方请大家见谅,欢迎批评指正
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软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。
用户论评