挖井

类库大魔王的挖井日记

挖一口属于自己的井


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

本文地址:

https://minidump.info/blog/2007/03/borland-e7-9a-84-e7-bc-96-e8-af-91-e5-99-a8-e4-b8-8d-e6-94-af-e6-8c-81-e6-88-90-e5-91-98-e5-87-bd-e6-95-b0-e6-a8-a1-e6-9d-bf-e7-89-b9-e5-8c-96/

上一篇

爱情呼叫转移

  昨晚回来后,连夜从VeryCD上下了《爱情呼叫转移》,并看完。虽然xcc说很搞笑,但我看的时候,却不怎么觉得,也许是因为从去年那段时间以来一直遗留下来的忧郁干扰的吧。忧郁于我来说,是太过容易的事情了。  片子让人感觉有点拼凑的嫌疑,其实像是讲述一个个的小故事,可硬要串在一起作为一部完整连续...…

Film & ACG 全文阅读
下一篇

新问题

  现在的新问题是,编译器不能编译显式特化泛化类的成员函数模板!从BDS的联机帮助上看到,这是编译器显式禁止的。郁闷!也就是说,LuaTinker中的代码,是不能直接用上来的!唉,真想不用BDS了,用VC不就行了。可是用VC的话,我只会用SDK,画界面真的太费时间了!其实还有个办法,就是好好学...…

CPPOOPGPXP Shareware 全文阅读