As soon as Björn is online with his site I'll add the according link :)
| where | erratum | correct |
|---|---|---|
| page 55, synopsis |
missing return type:
template <class Target, class Source>
|
template <class Target, class Source>
|
page 100 |
boost::enable_if<has_type<T>, void>::type
|
equivalent to:enable_if<has_type<T> >::type |
page 101 |
boost::enable_if<false>::typeproblem 1: wrong syntax problem 2: return type is not void |
problem 1: ad 1a: enable_if<bool_<false> >::typead 1b: enable_if_c<false>::type |
| page 108, 109 |
subtractable:T operator+=(const T&);T operator-=(const T&, const T&);orable: T operator|=(const T&, const T&);andable: T operator&=(const T&, const T&); |
ad sub:T operator-=(const T&);T operator-=(const T&);ad or: T operator|=(const T&);ad and: T operator&=(const T&);
|
| page 117 | CRTP == Barton-Nackman-trick (incorrect) |
see the Barton-Nackman-trick confusion |
| page 168 | std::map |
std::vector |
| page 229 | boost::tuples::element<0,Tuple> |
boost::tuples::element<0,Tuple>::type |
| page 232 | typedef ... mytuple |
never used |
page 286: we are slightly modifying the example from page 286 to show the problem. Instead of vec we use
vec1 and vec2.
vector<int> vec1; // contains some elements vector<int> vec2; // emptya. using the STL:
transform (vec1.begin(), vec1.end(), vec2.begin(), bind1st(plus<int>, 4));b. in the book:
transform (vec1.begin(), vec1.end(), vec2.begin(), _1 += 4);version b. modifies
vec1 and vec2 where a. alters only vec2.
transform (vec1.begin(), vec1.end(), vec2.begin(), _1 + 4); // + instead of +=d. if the operation is in situ one could alternatively use the more compact form applying
for_each instead of
transfrom (version c.) as presented in the book
for_each (vec.begin(), vec.end(), _1 += 4);
page 291 (note): Even though you can achieve the same thing in two
different ways using "boost/lambda/bind.hpp" and "boost/bind.hpp" you must carefully
disambiguate the symbols and use a slightly different notation. In addition, the function
object ap must meet different specs for the return-type. Specifically,
boost::lambda::bind expects a nested template class sig whereas
boost::bind kindly accepts the STL typedef result_type.
a. using "boost/lambda/bind.hpp"
transform (vec.begin (), vec.end (), vec.begin ()), boost::lambda::bind(boost::lambda::var(ap), boost::lambda::_1));b. using "boost/bind.hpp"
transform (vec.begin (), vec.end (), vec.begin (), boost::bind(ap, _1));
| page 292 | incorrectly rephrased from lambda-lib-docu | 1. If the function object defines several function call operators, there is
no way to specify different result types for them. 2. If the function call operator is a template, the result type may depend on the template parameters. Hence, the typedef ought to be a template too, which the C++ language does not support. |
page 319, 320 | in class notifier: useless member value_ |
purge value_ |
page 319: in class notifier one could rewrite the code for change_value as follows
#include <boost/bind.hpp>
#include <boost/bind/apply.hpp>
void notifier::change_value (int i)
{
for_each (vec_.begin (), vec_.end (), bind (apply<void> (), _1, i));
}
instead of
void notifier::change_value (int i)
{
value_=i;
for (std::size_t i=1;i<vec_.size();++i) {
(*vec_[i])(value_);
}
}