Der folgende Code funktioniert einwandfrei und gibt 50 wie erwartet aus. Was ich jedoch nicht verstehe, ist, warum das gleiche Programm nicht mit ein paar leichten Änderungen an diesem Code geschrieben werden kann. Die beiden Linien des vorgeschlagenen Code sind Bad markiert Code 1 und 2. Wenn diese für den aktuellen Arbeitscode links von ihnen ersetzt werden (dh in addStuff
und main
), erhalte ich folgende Fehlermeldung:Problem beim Kombinieren von Vorlagen und Überladen der Klassenfunktion
error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream}' and 'MyClass')|
Die So habe ich erwartet, dass es funktioniert: Wenn addStuff(x,y)
in der (schlechten) cout
Zeile von main()
aufgerufen wird, wertet es zuerst x+y
aus, deren Verhalten durch die operator+
MyClass überladene Memberfunktion definiert ist. Dies sollte nur ein MyClass-Objekt zurückgeben, das dann keine Probleme hat, getVar aufzurufen.
Was fehlt mir hier?
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass(){}
MyClass(int a) : priV(a){}
MyClass operator+(MyClass otherMC)
{
MyClass newMC;
newMC.priV = this->priV + otherMC.priV;
return newMC;
}
int getVar(){return priV;}
void setVar(int v){priV=v;}
private:
int priV;
};
template <class gen>
gen addStuff(gen x, gen y)
{
return x+y; //Bad code 1: return (x+y).getVar();
}
int main()
{
MyClass x(20), y(30);
cout << addStuff(x,y).getVar() << endl; //Bad code 2: cout << addStuff(x,y) << endl;
}
fehlerhafter Code 1: falscher Typ wird zurückgegeben. bad code 2: implementiere den ostream << für den Typ, den du behandeln willst, oder benutze getVar() wie du explizit in einen Typ konvertiert hast, den ostream bereits behandelt. –