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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 5162
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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...
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

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

Beitrag von CodingCat »

Wie sieht es aus, wenn du die Prototypen vor die Klassendefinition ziehst?
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 5162
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten