Ah
#include "logic.h"
...
class A
{
friend ostream& operator<<(ostream&, A&);
...
};
logik.cpp
#include "a.h"
...
ostream& logic::operator<<(ostream& os, A& a)
{
...
}
...
Wenn ich kompiliere, heißt es:
std :: ostream & Logik :: Operator << (std :: ostream &, A &) 'muss genau ein Argument annehmen.
Was ist das Problem?
Eine Friend-Funktion ist keine Member-Funktion. Das Problem besteht also darin, dass Sie sich
operator<<
als Freund von deklarierenA
:Versuchen Sie dann, es als Elementfunktion der Klasse zu definieren
logic
Sind Sie verwirrt darüber, ob
logic
es sich um eine Klasse oder einen Namespace handelt?Der Fehler liegt darin, dass Sie versucht haben, ein Mitglied
operator<<
mit zwei Argumenten zu definieren. Dies bedeutet, dass drei Argumente einschließlich des implizitenthis
Parameters verwendet werden. Der Operator kann nur zwei Argumente annehmen, sodass beim Schreibena << b
die beiden Argumentea
und sindb
.Sie möchten
ostream& operator<<(ostream&, const A&)
als Nichtmitgliedsfunktion definieren, definitiv nicht als Mitglied von,logic
da dies nichts mit dieser Klasse zu tun hat!quelle
Ich bin auf dieses Problem mit Vorlagenklassen gestoßen. Hier ist eine allgemeinere Lösung, die ich verwenden musste:
Jetzt: * Meine Funktion toString () kann nicht inline sein, wenn sie in cpp versteckt wird. * Du hast einen Code in der Kopfzeile, ich konnte ihn nicht loswerden. * Der Operator ruft die toString () -Methode auf, sie ist nicht inline.
Der Hauptteil des Operators << kann in der friend-Klausel oder außerhalb der Klasse deklariert werden. Beide Optionen sind hässlich. :(
Vielleicht verstehe ich etwas falsch oder vermisse etwas, aber nur das Vorwärtsdeklarieren der Operatorvorlage führt nicht zu einer Verknüpfung mit gcc.
Das funktioniert auch:
Ich denke, Sie können auch die Vorlagenprobleme vermeiden, die Deklarationen in Headern erzwingen, wenn Sie eine übergeordnete Klasse verwenden, die nicht als Vorlage für die Implementierung des Operators << vorgesehen ist, und eine virtuelle toString () -Methode verwenden.
quelle
Wenn Sie
operator<<
als Elementfunktion definieren, hat diese eine andere zerlegte Syntax als wenn Sie ein Nichtmitglied verwendet habenoperator<<
. Ein Nichtmitgliedoperator<<
ist ein binärer Operator, wobei ein Mitgliedoperator<<
ein unärer Operator ist.Also ... wie nennt man sie wirklich? Operatoren sind in gewisser Hinsicht seltsam. Ich fordere Sie auf, die
operator<<(...)
Syntax in Ihren Kopf zu schreiben , damit die Dinge Sinn ergeben.Oder Sie könnten versuchen, den Nicht-Mitglied-Binäroperator aufzurufen:
Sie sind nicht verpflichtet, diese Operatoren dazu zu bringen, sich intuitiv zu verhalten, wenn Sie sie zu Elementfunktionen machen. Sie können festlegen, dass eine Elementvariable
operator<<(int)
nach links verschoben wird, wenn Sie möchten schreiben.Fast schließlich kann es Zeiten geben, in denen beide Zerlegungen für einen Operatoranruf gültig sind. Hier können Probleme auftreten, und wir werden dieses Gespräch verschieben.
Beachten Sie zum Schluss, wie seltsam es sein kann, einen unären Member-Operator zu schreiben, der wie ein binärer Operator aussehen soll (da Sie Member-Operatoren virtuell machen können ..... auch versuchen, diesen Pfad nicht weiterzuentwickeln und zu durchlaufen .... )
Diese Syntax wird jetzt viele Programmierer irritieren ...
Beachten Sie, wie das
cout
zweite Argument in der Kette hier ist .... ungerade richtig?quelle