2016-06-14 8 views
1

Es tut mir leid, wenn diese Frage bereits beantwortet wurde, aber ich habe eine Menge Fragen gelesen, die diesen Operator in einer Template-Klasse überladen, aber ich habe keinen bestimmten Fall gefunden .Überladen des Operators << in einer Template-Klasse

Dies ist mein Code:

#include <iostream> 

using std::cout; 
using std::endl; 
using std::ostream; 

template <typename T> 
class Class 
{ 
    T x; 
    public: 
    friend ostream& operator << (const Class<T>&, ostream& out); 
}; 

template <typename T> 
ostream& operator << (const Class<T>&, ostream& out) 
{ 
    return (out << out.x << endl); 
} 

int main() 
{ 
    Class<short> object; 
    cout << object << endl; 
} 

Und ich bekomme diesen Fehler auf der letzten Zeile: Fehler 1 Fehler C2679: binary ‚< <‘: gefunden kein Betreiber, die einen rechten Operanden vom Typ nimmt ' Class' (oder gibt es keine akzeptable Umwandlung) g: \ ucenje \ objektno orijentirano programiranje \ Template3 \ Template3 \ main.cpp 25 1 Template3

+0

Mögliche Duplikat [Freund Erklärung deklariert eine Nicht-Template-Funktion] (http://stackoverflow.com/questions/4039817/friend-declaration-declares-a-non-template-function) –

Antwort

4

1. std::ostream sollte der 1. Parameter des operator<< sein, so

template <typename T> 
ostream& operator << (const Class<T>&, ostream& out) 

sollte

template <typename T> 
ostream& operator << (ostream& out, const Class<T>& c) 

2.You operator<< als Template-Funktion definiert werden, aber friend ostream& operator << (const Class<T>&, ostream& out); zeigt auf eine Nicht-Template Funktion, sollten Sie es zu

friend ostream& operator<< <T>(ostream& out, const Class<T>& c); 
ändern

Und einige Vorwärts-Erklärungen vor der Deklaration der Klasse hinzufügen:

template <typename T> 
class Class; 
template <typename T> 
ostream& operator << (ostream& out, const Class<T>& c); 

LIVE1

Oder Sie operator<< als Nicht-Template-Funktion innerhalb der Definition der Klasse definieren können.

template <typename T> 
class Class 
{ 
    T x; 
    public: 
    friend ostream& operator<< (ostream& out, const Class<T>& c) 
    { 
     out << c.x << endl; 
     return out; 
    } 
}; 

LIVE2

+0

@Scarass No. 'operator <<' muss eine Nichtmitgliedsfunktion sein. – songyuanyao

+0

sicher? aber das ist nur für Template-Klassen richtig? – Scarass

+0

@Scarass Nein, das gilt auch für Nicht-Template-Klassen. Beachten Sie, dass der Operator << '' ostream' als erstes Argument annehmen muss, und Sie können denken, dass die Elementfunktion immer das Objekt als erstes Argument (als 'diesen' Zeiger) annehmen wird. – songyuanyao

4

die Argumente für den operator<< Funktionen umgeschaltet worden sind, sollte es sich beispielsweise um

friend ostream& operator << (ostream& out, const Class<T>&1); 

Die linke Seite aller binären Operatoren ist immer das erste Argument, und die rechte Seite ist das zweite Argument.