英文原版勘误:
http://ptgmedia.pearsoncmg.com/images/9780201721485/Errata/Lippman_0201721481_Errata.html
博客内容转自:http://student.csdn.net/space.php?uid=130620&do=blog&id=21655
C++ Primer (第四版)勘误: 我自己整理的网上资料.
1.
在《C++ Primer》第四版section9.2. Iterators and Iterator Ranges中的Table 9.4. Operations Supported by vector and deque Iterators中列出了两种运算:
iter1 += iter2
iter1 -= iter2
Compound-assignment versions of iterator addition and subtraction. Assigns the value of adding or subtracting iter1 and iter2 into iter1.
一看到这两个表达式时就感觉有点怪,因为指针和迭代器是非常相似的,而指针并不支持+=、-+复合赋值运算符。在VS2005中写了个小测试程序却 得到了如下错误:
error C2679: binary '+=' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Ty,_Alloc>' (or there is no acceptable conversion)
google一下,很多人说应该是作者的错误。于是查了C++ Primer Errata(勘误表),(英文版)Lippman已经对此进行勘误:
Page 313: The description of the compound assignment operators in Table 9.4 incorrectly refer to iter2 as the right-hand operand; in each instance, iter2 should be replaced by n. The right-hand operand must be an integral value, not an iterator.
正确的形式应该为:
iter1 += n
iter1 -= n
2.
来自CSDN一位网友的博客:
P13(第13页) “不是所有编译器都有这一要求”后半句应翻译为“都满足这一标准”。
影响阅读程度:严重
说明:“编译器”如何能“要求”C++标准?原英文版中的“enforce”应翻译为“满足”而不是“有”,动宾关系才不会搞反。
P43 “有多个初始化式时不能使用复制初始化”前半句应翻译为“有多个初始化参数时”。
影响程度:一般
P45 “如果定义某个类的变量时没有提供初始化式….”这句和后一句应翻译为“如果定义某个类的变量时没有提供初始化参数,那么系统会调用该类的’缺省构造函 数’。”
影响程度:一般
P50 有三处的“const变量”翻译为“const常量”或“const对象”比较好,虽然原英文版有两处也是用const variable。
影响程度:轻微
P52 “仅允许const引用绑定到需要临时使用的值”应翻译为“仅允许const引用绑定到需要临时值中转来完成绑定过程的对象”
影响程度:严重
说明:译者对宾语的主体理解错误。原英文版中的“临时使用的值”是用来修饰value(对象)的,不是最终的宾语。
因为对于程序员来说,编译器做的中转工作是透明的,const引用最终还是绑定到对象,虽然结果相同。
P65 “word(字)机器上的自然的整型计算单元”应翻译为“word(字)是在给定机器上进行整型计算的原始单元”
影响程度:一般
P79 “v4含有值初始化的元素”这句应翻译为“v4含有n个用缺省构造函数中的值初始化的元素”
影响程度:严重
P79 “动态地添加元素”这句应翻译为“当元素值已知时,最好是通过动态地向它添加元素,来让它增长。”
影响程度:一般
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SearchLife/archive/2008/12/10/3490669.aspx
3.
页码 行数 原译文 更正 备注
70 -6 String string
80 13 vector<string> fvec(10) vector<int> fvec(10)
119 15 pc + 1 pc
120 -13 解释这两个程序 解释这两段程序
228 2 添加两个Sales_item对象 将两个Sales_item对象相加
268 13 存储deque对象里的元素 存储deque对象元素
269 -3 与vector对象的一个元素捆绑在一起 绑定到vector对象的一个元素
278 -10 长度大小 大小
281 -11 必须确保迭代器是不是end迭代器 必须确保迭代器不是end迭代器
300 -13 2.覆写基础容器类型 2.覆盖基础容器类型
300 -11 覆写 覆盖
325 -12 名字 及其作品
338 5-6 第二个迭代器所指向的元素[有时被称为超出末端迭代器(off-the-end iterator)] 第二个迭代器[有时被称为超出末端迭代器(off-the-end iterator)]所指向的元素
446 -2 另一个指向数组的末端 另一个指向超出数组末端的下一位置
451 -7 但测试给定的长度是否与其边界相匹配 但测试给定string对象的长度是否与其边界相匹配
457 -7 const int(); operator const int();
457 -6 int() const; operator int() const;
463 -13 成员函数应指定为public
463 -5 public public:
466 13 成员函数应指定为public
466 21 complex Complex
474 -8 保留字 保留字virtual
487 习题之上的代码段最后加上一个“}”
491 -3 std::string& book, double sales_price, std::string& book="", double sales_price=0.0,
496 16 基类几乎总是需要构造函数 基类几乎总是需要析构函数
506 -4 减1 加1
509 10 使用带关联容器的比较器 使用带比较器的关联容器
511 -16 该操作符返回句柄所关联的基础Item_base对象,用该Item_base对象调用 该操作符返回句柄所关联的基础Item_base对象的指针,用该Item_base对象指针调用
516 11 构造函数 析构函数
542 -5 调用 定义
542 -17 传递两个字符串字面值调用compare是切合实际的 使得可以传递两个字符串字面值调用compare
543 2 方式构造程序的 构造程序的方式
550 ‘-18及-16 Queue<int> Queue<string>
551 -4 解释为什么 解释导致什么实例化
605 -12 为什么在程序中可以定义自己的命名空间? 为什么在程序中定义自己的命名空间?