Seite 1 von 1

[C++] externen Operator in Klasse als friend deklarieren

Verfasst: 13.06.2012, 14:19
von Schrompf
Moin Leute,

ich habe mich zu früh gefreut. Ich hänge hier an einer Stelle, bei der ich den Compiler nicht überredet bekomme, eine extern definierte Funktion als Freund zu akzeptieren. Folgender verkürzter Code:

Code: Alles auswählen

 namespace Bla {
  class Blubb {
    friend StreamReader& operator >> (StreamReader&, Blubb&);
    friend StreamWriter& operator << (StreamWriter&, const Blubb&);

    ...
  };

  // Prototypen
  StreamReader& operator >> (StreamReader& reader, Blubb& bl);
  StreamWriter& operator << (StreamWriter& writer, const Blubb& bl);
}

// Implementierung in CPP-Datei
StreamReader& operator >> (StreamReader& reader, Blubb& bl) { ... }
Ich bin eigentlich der Meinung, dass das so funktionieren sollte. Trotzdem schimpft VS10 auf mich, dass ich in den Operatoren keinen Zugriff auf private Elemente von Blubb hätte. Was mache ich falsch? Es ist wahrscheinlich irgendwas mit dem Namespace...

Re: [C++] externen Operator in Klasse als friend deklarieren

Verfasst: 13.06.2012, 14:25
von CodingCat
Wie sieht es aus, wenn du die Prototypen vor die Klassendefinition ziehst?

Re: [C++] externen Operator in Klasse als friend deklarieren

Verfasst: 13.06.2012, 14:25
von Schrompf
Es hilft doch, Probleme mal aufzuschreiben. Sorry für den Spam, aber ich habe das Problem gelöst.

Ursache: mit der friend-Deklaration und dem Funktionsprototyp im Header habe ich den Operator innerhalb des Namespace deklariert. Die Implementation war dann aber ohne Namespace, der Compiler hat hier quasi einen zweiten Operator-Overload im globalen Namespace angelegt. Der war dann natürlich kein Freund der Klasse und hatte demzufolge keinen Zugriff auf deren interne Variablen.

So geht's jetzt:

Code: Alles auswählen

 namespace Bla {
  class Blubb {
    friend StreamReader& operator >> (StreamReader&, Blubb&);
    friend StreamWriter& operator << (StreamWriter&, const Blubb&);

    ...
  };

  // Prototypen
  StreamReader& operator >> (StreamReader& reader, Blubb& bl);
  StreamWriter& operator << (StreamWriter& writer, const Blubb& bl);
}

// Implementierung in CPP-Datei
StreamReader& Bla::operator >> (StreamReader& reader, Blubb& bl) { ... }
Der Unterschied zum ursprünglichen Code ist nur die Namespace-Angabe vor dem Funktionsnamen bei der Implementation in der CPP-Datei.

[edit] Doch zu langsam. Danke für den Tipp, aber daran lag's nicht.