C++ Templates 中文版勘误(持续更新)

说明

  本内容适用与陈伟柱译的《C++ Templates 中文版》,人民邮电出版社,ISBN 978-7-115-31281-5
部分错误为英文原版第一版书籍也存在的错误,其它翻译版或原版可对照参考

勘误表

第1部分 基础

第3章 类模板

3.2 类模板 Stack 的使用
P26:

  你可以像使用其他任何类型一样地使用实例化后的类模板类型(如 Stack< int>),只要它支持所调用的操作就可以

  严格来说,这样表述才是正确的 实例化的类模板的类型可以与任何其他类型一样使用。可以使用 const 或 volatile对其进行限定,或者从中派生数组和引用类型。甚至可以在构建另一个模板类型时将其用作类型参数:

第5章 技巧性基础知识

5.3 成员模板5.4 模板的模板参数
P43、P45、P49:

if ((void*) this == (void*)& op2) {  //赋值给自身吗 
    return *this; 
}

  此处判断是无用的。由于模板重载解析的问题,判断rsh==this没有必要,因为存在针对相同类型默认的模板成员赋值赋值运算符,则会被优先使用。赋值自身必然是交由默认的模板成员赋值运算符来完成的,不会使用这个模板赋值运算符。

第2部分 深入模板

第8章 深入模板基础

8.3.3 非类型实参
P105、P07:

Public:

修正为:

public:
第9章 模板中的名称

9.2.3 插入式类名称
P122:

 C<void> b;

修改为:

C<void> *b;

  原因:类不能递归定义,因为编译器在为具体的对象分配大小时必须知道其大小。
P126:

我们改写了(泛型的)Trap X::x,

此处应该为:
我们改写了(泛型的)Trap::x,

第10章 实例化

10.3.4 跨翻译单元查找
P147:对第二阶段查找的描述错误

  第2阶段发生在产生 POI(实例化点)的时候。在这在这一点上,会使用普通查找规则和 ADL 规则来查找依赖型受限名称。

显然是错误的,ADL查找只能查找非受限名称,修改为
  第2阶段发生在产生 POI(实例化点)的时候。在这在这一点上,会使用普通查找规则来查找依赖型受限名称。

第11章 模板实参演绎

11.3 特殊的演绎情况
P168代码:

 template<typename T, int N> operator T[N]&();

应该为:

 template<typename T, int N> operator T&();

P168代码错误引起的描述错误:

  在此,我们试图把 S 转型为 int (&)[20]; 因此,类型 A 为 int[ 20],而类型 P 为 T[N]。于是,用类型 int 替换 T,用 20 替换 N 之后,该演绎就是成功的。

修改为:
  在此,我们试图把 S 转型为 int (&)[20]; 因此,类型 A 为 int[ 20],而类型 P 为 T。于是,用类型 int[20] 替换 T,该演绎就是成功的。

第3部分 模板与设计

第18章 表达式模板

18.2.5 表达式模板赋值
P330:

template< typename T, typename R1, typename R2>
Array< T, A_ Subscript< T, R1, R2> > 
Array< T, R1>:: operator[] (Array< T, R2> const & b) { 
    return Array< T, A_ Subscript< T, R1, R2> > 
        (A_ Subscript< T, R1, R2>( this> rep(), b. rep())); 
}

改进,从通用性的角度考虑,考虑隐式转换存在,修改如下:

template<typename T,typename R>
tempate<typename T1,template R1> 
inline Array<T,A_Subscript<T,R,R1> > 
Array<T,R> :: operator[](Array<T1,R1> const& b{ 
    return Array<T,A_Subscript<T,R,R1> >
        (A_Subscript<T,R,R1>(this->rep(),b->rep())); 
}

第4部分 高级应用程序

第20章 智能指针

20.2.8 隐式转型
P380:

class CountingPtr; friend

修改为:

friend class CountingPtr;
发表于 December 19, 2020