Errata

S. 34 ganz unten: Statt "beiden Operatoren" muss es "zwei Operanden" heißen.

S. 41, Listing 1.11 unten: Bitte fügen Sie nach #include <iostream> die Zeile #include <string> ein (auch wenn Ihr Compiler das Fehlen nicht bemängelt).

S. 43, zweite Zeile: Ersetzen Sie die Variable c durch ein.

S. 60, Text unter dem Listing: Die Schleife beginnt natürlich in Zeile 6. Die Abfrage wird wiederholt, solange die Eingabe fehlerhaft ist ("nicht" streichen).

S. 84, oberes Drittel: Fügen Sie direkt nach der Zeile cin >> dateiname; die Zeile cin.ignore(100,'\n'); ein, um das Zeilenendezeichen '\n' aus dem Tastaturpuffer zu entfernen. cin.ignore(N,'\n'); entfernt alle Zeichen aus dem Tastaturpuffer bis zum Zeilenendezeichen '\n', aber maximal N. Das Zeilenendezeichen wird mit entfernt.

S. 105 Mitte und S. 234, Listing 9.13: In constexpr const usw. ist const überflüssig.

S. 110-111: Die eigentliche Ausgabe des Programms wird durch die protokollierenden Ausgaben "zerhauen". Abilfe: In Listing 4.12 den Inhalt von main() so ersetzen:

std::size_t zahl = 4;
std::size_t erg = fakultaet(zahl);
std::cout << "Die Fakultät von " << zahl << " ist " << erg << '\n';

S. 237, Quiz Fragen b) und c). Die Fragen sind falsch gestellt. Sie lauten richtig:
b) Vom Typ des Objekts, auf das ein Zeiger verweist, über den die Funktion aufgerufen wird.
c) Vom Typ des Objekts, auf das eine Referenz verweist, über die die Funktion aufgerufen wird.
Die Begründung ist im grauen Kasten auf S. 222 zu finden.

S. 306: Die Parameter sind falsch. Listing 13.3. muss ersetzt werden durch

template <>
bool kleiner(const bool& a, const bool& b) {
  assert(false && "Vergleich von bool-Variablen ist nicht sinnvoll. Abbruch!\n");
  return a < b; 
}

Das in Listing 13.3 ursprünglich vorhandene static_assert schlägt bei jeder Compilation fehl, auch wenn das Template nicht instantiiert wird. Der Grund: Das Argument von static_assert hängt nicht von einem Template-Parameter ab. Mit der Änderung wird das Programm zur Laufzeit nur bei einem Aufruf der Funktion kleiner(a,b) mit bool-Argumenten a und b abgebrochen.

Es gibt Möglichkeiten, schon zur Übersetzungszeit eine Fehlermeldung zu erzeugen, aber das setzt eine Änderung des Templates in Listing 13.2 (S. 304) voraus und erfordert in diesem Buch nicht behandelte C++-Elemente. Listing 13.4. muss ersetzt werden durch

template <>
bool kleiner(const char* const& a, const char* const& b) {
  return std::strcmp(a, b) < 0;
}

S. 372: Die Installation von SFML kann bei vielen Linux-Systemen einfach mit apt install libsfml-dev (z.B. bei Linux Mint) erledigt werden. Der aufwendige "Selbstbau" entfällt dann.