This is printing 1.  Also available are errata for the first year, and printings 6 and 9.
Errata for

Bjarne Stroustrup:
The C++ Programming Language (2nd edition)

Addison-Wesley, 1991, ISBN0-201-53992-6, first printing.
The corrections here cover program bugs and stylistic issues in the program fragments, but not simple typos in the text.  I am grateful to all that have pointed out problems to me.

For brevity I have used the old ed syntax: s/old-text/new-text/

pg25,29,99,194  s/stream.h/iostream/

pg39  s/cs.pop()/s.pop()/

pg64,99,116,119  s/main()/int main()/

pg71    s/unsigned/unsigned int/    in struct sreg

pg85,86,87  s/"\n"/'\n'/

pg99  #include <stdlib.h> (to get the declaration of exit())

pg112  s/struct S { int a; char b; }/struct S { int a; char b; };/

pg116,118  s/const TBLSZ/const int TBLSZ/

pg141  s/r.8.5/r.9.3/

pg152  s/delete s;/delete[] s;/

pg156  s/delete n->string;/delete[] n->string;/

pg158  main() should be
int main(int argc, char *argv[])
{
    if (argc != 3) error("two arguments expected");
    int count = 0;
    int m = atoi(argv[1]);      // number of set members
    int n = atoi(argv[2]);      // in the range 1..n
    intset s(m,n);

    while (count<m) {
        int t = randint(n);
        if (s.member(t)==0) {
            s.insert(t);
            count++;
        }
    }

    print_in_order(&s);
}
pg159  s/delete x;/delete[] x;/

pg170 function error():  name the arguments a1,a2, and a3

pg191  s/rotate::shape/shape::rotate/

pg191  s/rotate::draw/shape::draw/

pg193  s/class character_device {/class character_device { public:/

pg195  delete first definition of on_screen().  (it is a duplicate)

pg197  s/point sw, ne;/class rectangle : public shape { point sw, ne;/

pg203  s/pending()/pending();/

pg204 for dip, dip1, and dip2  s/debug_info/debug_info*/

pg204  s/dip.merge/dip->merge/

pg205,206  s/mamager::/manager::/

pg208  s/from the work done from the base class./
from the work done from the derived class./

pg210,211  s/: public virtual window public window_w_input/: public virtual window, public window_w_input,/

pg218  s/void copy(expr* s);/void copy(expr* s, deep = 0);/

pg219  s/left = s->clone(1);/left = s->left->clone(1);/

pg219  s/right = s->clone(1);/right = s->right->clone(1);/

pg220  s/conditional::copy(expr* s, int deep)/
conditional::copy(conditional* s, int deep)/

pg228  s/ivate:/private:/

pg229  s/trivially handled using friend functions/
trivially handled using nonmember functions/

pg231  s/return this;/return *this;/

pg237  s/delete p;/delete[] p;/

pg241  s/max = (s<16) ? s : 16;/max = (s<16) ? 16 : s;/

pg243  s/assoc* cs;/const assoc* cs;/

pg262  s/insert(T&/insert(const T&/

pg262  s/append(T&/append(const T&/

pg262  s/lnk.info/lnk->;info/

pg263  s/lst1.insert(*p)/lst1.insert(p)/

pg265  the declaration of Isplist should be
template<class T>
class Isplist : private slist_base {
public:
    void insert(T* p) { slist_base::insert(p); }
    void append(T* p) { slist_base::append(p); }
    T* get() { return (T*) slist_base::get(); }
};
pg277  the declaration of the sort function should be
template<class T, class Comp> void Sort<T,Comp>::sort(Vector<T>& v)
{
    for (int i=0; i<n-1; i++)
        for (int j=n-1; i<j; j--)
            if (Comp::lessthan(v[j],v[j-1])) {
                T temp = v[j];
                v[j] = v[j-1];
                v[j-1] = temp;
            }
}
pg280  the examples should be
template<class T> void f1(T);   // fine
template<class T> void f2(T*);  // fine
template<class T> T f3(int);    // error
template<int i> void f4(int[][i]);  // error
template<int i> void f5(int = i);   // error
template<class T, class C> void f6(T);  // error
template<class T> void f7(const T&, complex);  // fine
template<class T> void f8(Vector< List<T> >);  // fine

pg306  s/mp.debug_print()/m.debug_print()/

pg306 first paragraph  s/Int_overflow's debug()/Int_overflow's debug_print()/

pg329  s/"("/'('/
s/","/','/
s/")"/')'/

pg335,336  s/,istream&,ostream&)/,cin,cout)/

pg340,341,342  s/10.4.2.7/10.4.2.1/

pg346,347  s/return f(os,i)/return m.f(os,m.i)/

pg355  the declarations of streambuf and filebuf should be
class streambuf {     // manage a stream buffer
protected:
    char* base;     // start of buffer
    char* pptr;     // next free char
    char* gptr;     // next filled char
    char* eptr;     // one off the end of buffer
    char  alloc;    // buffer allocated by "new"
// ...

        // Empty a buffer:
        // Return EOF on error, 0 on success
    virtual int overflow(int c =EOF);

        // Fill a buffer:
        // Return EOF on error or end of input,
        // next char otherwise
    virtual int underflow();
    // ...
public:
    streambuf();
    streambuf(char* p, int l);
    virtual ~streambuf();

    int snextc()        // get the next char
    {
        return (++gptr==pptr) ? underflow() : *gptr&0377;
    }

    int allocate();     // allocate some buffer space
    // ...
};

class filebuf : public streambuf {
protected:
    int  fd;            // file descriptor
    char opened;        // file opened
public:
    filebuf() { opened = 0; }
    filebuf(int nfd, char* p, int l)
        : streambuf(p,l) { /* ... */ }
   ~filebuf() { close(); }

    int overflow(int c =EOF);
    int underflow();

    filebuf* open(char *name, ios::open_mode om);
    int close() { /* ... */ }
    // ...
};
pg409  s/C(int i)/C2(int i)/

pg409  s/~C()/~C2()/

pg410  s/C(X* q)/C3(X* q)/

pg410  s/C(X& q)/C4(X& q)/

pg418  add `int size() { return sz; }' as a public mermber of String

pg419  s/Assert(i<0 && i<s.size()/Assert(0<=i && i<size()/

pg435  s/: private array/: private vector/

pg438  add `virtual ~iter();' to the declaration of class iter

pg438  s/istream& is/istream& is;/

pg453  s/operator[](int)/operator[](int);/

pg467  s/Map<void*,void(*)()> m;/Map<void*,void(*)(void*)> m;/

pg472  s/, count(new int)/, pcount(new int)/

pg473  the declaration of class X should be
class X {
    static Pool my_pool;
    // ...
public:
    // ...
    void* operator new(size_t) { return my_pool.alloc(); }
    void operator delete(void* p) { my_pool.free(p); }
};

Pool X::my_pool(sizeof(X));
pg473  s/class Link/struct Link/

pg474  the definition of the constructor should be
Pool::Pool(unsigned sz)
    : esize(sz)
{
    head = 0;
}

pg474  s/const overhead = 12/const int overhead = 12;/

in the index:  every reference to the manual proper refers to page n where it
should refer to page n-1

People have been polite enough not to inquire how so many errors could creep in.  In the case of most non-stylistic bugs, the answer is in trouble with the software that inserts fragments of the tested code examples into the text.


To track new developments, both the Annotated Reference Manual and Bjarne Stroustrup's book have an identical ``extra'' chapter that is updated a couple of times a year.  Its most recent version and the most recent errata sheet are available from Software, Tool & Die's ftp server in directory AW/stroustrup2e.
Thanks to Bjarne Stroustrup (bs@research.att.com) for errata and pointer.
Markup, etc. by jutta@pobox.com, corrections and comments welcomed.