类库大魔王
类库大魔王 多年C++、Go项目经验,长期从事跨平台(Windows/macOS/iOS/Android)应用架构设计与开发。

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++的标准,呵呵。

感觉本文不错,不妨小额鼓励我一下!
如果你有Visa、MasterCard之类的国际银行卡,也可以考虑以下选项:
如果你看不到评论框,说明Disqus被墙了。