Borland的编译器不支持成员函数模板特化
用的是BDS2006,看版本号是5.82版的编译器了,相比以前即BCB6里带的编译器,虽然没有评估过有多少改进,明显的只是编译速度较之以前大大提高了。今天为了LuaSuck,一边改LuaTinker一边编译,发现它居然对成员函数模板的特化视而不见!
用的BDS2006里的编译器,这样试一下:
class kk
{
public:
template<typename T>
static T test()
{
T t;
cout << "general edition" <<endl;
}
template<>
static int test()
{
int i;
cout << "int edition" <<endl;
}
template<typename T>
T test2()
{
T t;
cout << "2 general edition" <<endl;
}
template<>
int test2()
{
int i;
cout << "2 int edition" <<endl;
}
template<typename T>
void test3(T t)
{
cout << "3 general edition" <<endl;
}
template<>
void test3(int t)
{
cout << "3 int edition" << endl;
}
};
int main(int argc, char* argv[])
{
kk k;
k.test<int>();
kk::test<int>();
k.test2<int>();
k.test3<int>(2);
k.test3<>(4);
return 0;
}
输出结果是这样的:
general edition
general edition
2 general edition
3 int edition
3 int edition
由此可见,如果模板参数是用于作为成员函数的参数类型的,是可以特化的,如果是作为函数返回值类型的,则总是调用泛化版本。但是VC8.0里就是这样的:
int edition
int edition
2 int edition
3 int edition
3 int edition
感觉好像VC中的作法是对的,但是没仔细深究过,很让我觉得头痛,我就需要这样的特性,它偏偏不支持!有时候想想,还真的需要好好研究一下C++的标准,呵呵。