模板类成员函数的特化版本选择

来源:互联网 发布:rar解压缩软件官方 编辑:程序博客网 时间:2024/06/13 11:34

写了个简单的代码如下


//  test.cpp:#include "test.h"int main(){C<int> c;c.func();}


// test.h#include <cstdio>template<typename T>class C{public:void func(){printf("111\n");}};


// test1.cpp#include "test.h"template<>void C<int>::func(){printf("222\n");}


分别在VS2008和gcc下编译,出现不同的结果:vs下打印111,gcc下打印222。

可见,在分离编译的情况下,vs没能找到函数特化的定义。


进一步测试发现,将特化定义从test1.cpp移至test.h,vs编译通过且打印222,gcc报重定义错误。

于是猜测如下:

vs下的函数特化定义依然是内链接的,所以必须在当前编译模块才能覆盖泛化定义;

gcc下函数特化定义是外链接的,并优先匹配给调用者;

另外,二者特化定义都必须出现在实例化之前,否则编译不通过

有待验证……