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. 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;
}