H
Hallo,
kleiner Típp: oft hilft es, wenn man einfach mal auf die Mitteilungen seines Compilers achtet. Die sind ja nicht primär dazu da einen zu ärgern sondern eigentlich als Hilfe gedacht. Es lohnt sich also sich in dieser Richtung ein wenig fortzubilden. Dazu gehört u.A, dass man die Fachbegriffe lernt, die bei der C++ Programmierung eine Rolle spielen, da der Compiler genau diese verwendet wenn er mit uns kommuniziert.
Z.B.
C:\c++\header.hpp 'In copy constructor `std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)':
738 C:\Programme\Dev-Cpp\include\c++\3.4.2\bits\ios_base.h `std::ios_base::ios_base(const std::ios_base&)' is private
Aha. Der Compiler teilt mit, dass der Copy-Ctor von ios_base private ist und das deshalb der Copy-Ctor von basic_ios nicht aufgerufen werden kann.
Leider versäumt der Compiler es hier den gesamten Instanziierungskontext zu nennen. Dafür teilt er die Zeilennummer mit, in der das Problem aufritt.
Nun müssen wir nur noch die folgenden zwei Fragen klären und schon ist das Problem gelöst:
1. In welcher Beziehung stehen basic_ios, ios_base und die genannte Zeile?
2. Wann wird ein Copy-Ctor aufgerufen?
Für die Beantwortung von 1. konsultiert man am Besten eine beliebige C++ Referenz. Nach kurzem lesen stellt man fest, dass es sich bei basic_ios und ios_base um Basisklassen von ostream handelt. Wir wissen also schonmal, dass irgendwas in der Verwendung von op den fehlerhaften Aufruf des Copy-Ctors verursacht.
Wann wird ein Copy-Ctor aufgerufen? Das weiß man entweder aus dem Kopf oder aber man konsultiert ein beliebiges C++ Einsteigerbuch. Im letzteren Fall braucht man etwa 10 Minuten um herauszufinden, dass der einzige Kontext in dem ein Copy-Ctor aufgerufen wird der hier in Frage kommt die by-value-Rückgabe ist.
Zusammengefasst:
a) Der Copy-Ctor von ostream ist nicht aufrufbar.
b) Die by-value-Rückgabe erfordert aber einen Copy-Ctor.
Mögliche Lösungen:
1. Wir machen den Copy-Ctor von ostream aufrufbar
2. Wir verzichten auf die by-value-Rückgabe.
1. ist keine gute Idee.
Bleibt 2. und damit z.B. die Möglichkeit op per Referenz zurückzuliefern.
ostream& operator<< (ostream& op, myclass& x)
{
return op<<x.get()<<"\n";
}