Problem mit binären, globalen Operatoren.



  • Hi erst mal. Ich benitze die Autoren-Version von VC++ 6.0 und hab folgendes Problem: Wenn ich einen globalen, binären Operator habe, dann kann ich ihn nicht als friend einer Klasse deklarieren. Bei mir geht dieses Beispiel nicht:

    #include <iostream>
    using namespace std;
    
    class DayTime
    {
    private:
        int hour;
    
    public:
        friend void operator < (DayTime&, DayTime&);
    };
    
    void operator < (DayTime& a, DayTime& b)
    {
        a.hour = 10;
    }
    
    int main()
    {
        return 0;
    }
    

    Bei anderen Leuten geht es jedoch zu compilieren 😕

    Der Compiler meldet:

    "hour" : Kein Zugriff auf private Element, dessen Deklaration in der Klasse "DayTime" erfolgte.

    Ich hab schon den Hinweis bekommen, mir das Service-Pack 6.0 für VC++ zu saugen, aber das ist gut 60 MB groß! Gibts eventuell eine Alternative schreibweise, mit der mein Compiler das verstehen könnte?



  • IIRC hilft es, auf die using-Direktive zu verzichten, oder sie zumindest hinter die Definition des Operators zu schreiben. Trotzdem empfehle ich dringend das SP.



  • Auf using zu verzichten hilft tatsächlich, aber ist ja keine wirkliche Lösung. Dann müsste ich ja bei jedem Funktionsaufruf std:: davor schreiben. Außerdem weiß man nie, ob nicht schon woanders using benutzt wurde.

    Kann man eventuell den Compiler von der Konsole aus starten oder die Fehlersuch-Stärke herbsetzen, damit der quelltext trotzdem compiliert wird?





  • Ja, das scheint genau mein Problem zu sein. Aber eine Lösung ist da nicht gegeben, nur ein Verweis auf die Hotline-Telefonnummern. Wenigstens sind da Tips gegeben, mit denen ich um den Bug herumprogrammieren kann. Das ist besser als garnichts. Also vielen Dank, die Seite hätt ich nie gefunden.

    Aber wie gefragt: Kann man den VC++ Compiler von der Konsole aus starten und/oder würde das etwas ändern?

    Edit: Ich seh grad, da steht, dass mit dem sp3 der bug behoben wurde. aber außer sp5 und 6 find ich keine älteren service packs mehr. weiß jemand, wo ich die herbekomme?



  • Ok, ich habe das Problem mit einer anderen Schreibweise beseitigt. Und weil wir in einem Forum voneinander lernen, schreibe ich meine Lösung auf:

    Bevor ich in der Klasse den Operator als Friend deklariere, deklariere ich einen Prototyp von ihm VOR der Klasse. Und weil ich in diesem Prototyp bereits die Klasse als Argument verwende, deklariere ich DAVOR einen Prototyp der Klasse, also so:

    #include <iostream>
    using namespace std;
    
    class DayTime;  // Mit diesen beiden Zeilen geht es.
    void operator < (DayTime&, DayTime&);
    
    class DayTime
    {
    private:
    	int hour;
    
    public:
    	friend void operator < (DayTime&, DayTime&);
    };
    
    void operator < (DayTime& a, DayTime& b)
    {
    	a.hour = 10;
    }
    
    int main()
    {
    	return 0;
    }
    

Anmelden zum Antworten