myan的重要更正:关于我在type_traits翻译文章中犯的一个错误

myan 2001-03-19 06:36:00
日前翻译A. Alexandrescu的traits技术文章时,在译注中犯了一个严重的错误,
今天得到一位网友的来信指出。为了挽回错误影响,将我们之间的通信公布如下:

在 2001-03-02 08:45:00 您写道:
>孟岩:
> 你好.
> 近日在CSDN上看到了你翻译的Andrei Alexandrescu介绍traits的文章,觉得受益匪
>浅.不过有一处不是很明白,恳请抽空指点.我对模板特化(template specialization)用
>的不多,可能有些概念还没有把握,所以我对于文中以下部分很不明白:
><quote>
>·这么干缺乏可扩展性。如果给给SmartPtr再增加一个模板参数,喏,全完蛋了!你不
>能特殊化这样一个SmartPtr<T. U>,其中模板参数T是Widget,而U可以为其他任何类
>型。不,你做不到。附带说一句,smart pointer经常用作模板参数。
>[译者附释:也就是说,显式模板特殊化的if-statement部分,针对特别的模板参数提
>供特别 的特殊化方案,要求定义时必须指定全部的参数类型,不能只是“部分指
>定”。例如:
> // else-part, 针对其他所有类型
> template <class T, class U>
> class Demo {...};
>
> template <>
> class Demo<type1, type2> {...}; //可以,T和U都指定了
>
> template <>
> class Demo<type3, U> {...}; // 不行,不能只指定部分模板参数
>
> template <class U>
> class Demo<type4, U> {...}; // 想蒙混过关?对不住,C++不允许]
></quote>
> 按照C++标准中类模板局部特化(template partial specialization)的概念( C++
>standard 14.5.4),template<class U> class Demo<type4,U>{};应该是
>template<class T,class U> class Demo{};的一个局部特化,为什么在此处不行呢
>(ps:VC是不支持局部特化的).我看原文时也是对作者一笔带过的说明不大理解,还望孟
>兄详细解释,谢谢.

我的答复:
你太客气了,应该直接指出我的错误。我当时举这个例子时使用了G++2.91编译没通过,
就错误地做出关于Demo<type4, U>的论断。后来试用BCC32和KCC编译很顺利,就知道
自己错了。我后来去看ISO14882,才真正了解了Partial Specialization. 实际上
编译器的推导机制非常强大,只要它能够以任何方式确定模板参数,就可以特殊化。

这真是一个教训,以后自己加译注时我一定会更加小心,以免再犯类似的错误。
谢谢你的提醒,我会把此信在CSDN上发表,挽回错误影响。

另:我可能会翻译你说的14.5.4节,到时候会先寄给你,请帮我做核查。谢谢!




礼!

孟岩
my518@263.net

...全文
226 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

15,447

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧