friend-Deklaration in Klasse (und Namensraum)



  • Hallo Leutz!

    Ich habe eine Klasse und in dieser eine globale Funktion als friend deklariert.
    Nun musste ich die Klasse einem Namespace hinzufügen und jetzt kompliert er
    mir das Programm nicht mehr.

    namespace knut {
    class Whopper {
    public:
    friend void callMe(int i, int a, blabla);
    ....
    private:
    static int _fd;
    .....
    };
    }

    using namespace knut;

    void callMe(...........){
    // ganz viel Zeugs hier
    Whopper::_fd = .....
    }

    Bevor ich den Namensraum angelegt habe, hat es funktioniert. Nun nicht mehr
    und ich verstehe leider nicht warum und wie ich das Problem lösen soll.

    Fehlermeldung:
    In function void callMe(...........)´: error:int knut::Whopper::_fd' is private
    error: within this context

    Kann mir irgendjemand helfen.

    Vielen Dank im voraus.

    Division_By_Zero

    P.S.: Ach so, ich benutze g++ Version 3.3



  • Die Funktion ::callMe() (im globalen Namensraum) ist etwas anderes als knut::callMe() - du hast nur letzterer friend-Zugriff gegeben (aber sie nicht definiert). Lösung: Entweder du gibst explizit an, daß du eine Funktion außerhalb des eigenen Namensraumes meinst (afaik mußt du die da vorher deklarieren) oder du verschiebst deine Funktion mit in den Namensraum.

    PS: Ehe ich es vergesse - sfds



  • Hallo!

    Erstmal danke für die Antwort.

    Ich habe nun folgendes gemacht:

    void callMe(...........);
    
    namespace knut {
        class Whopper {
          public:
            friend void ::callMe(int i, int a, blabla);
            ....
          private:
            static int _fd;
            .....
        };
    }
    
    void callMe(...........){
    // ganz viel Zeugs hier
        knut::Whopper::_fd = .....
    }
    

    Also einfach gesagt das callMe() im globalen Namensraum ist.
    Aber nun bekomme ich andere Fehlermeldungen vom Linker:

    multiple definition of `callMe()`

    Anscheinend sind nun mehrfach Definitionen dieser globalen Funktion vorhanden durch das Einbinden der Header-Datei in andere Header.
    Ich weiß nun leider nicht mehr weiter. Kann man da irgendwas gegen tun???
    Was aufkeinen Fall geht ist, die Funktion callMe() in einen Namensraum zu packen. Da es nämlich eine C-Funktion ist und ich ein C++-Programm drumherum
    schreiben muss.

    MfG

    Division_By_Zero



  • Ich hoffe mal, die Definition "void callMe(...){...}" steht nicht direkt im Header - dort hat sie nämlich nichts zu suchen.

    PS: Ich hab' doch noch gar nichts getrunken und sehe trotzdem alles doppelt - was'n das 😃



  • Nee, die Definition steht nicht in der Header-Datei sondern in der entsprechenden Implementations-Datei.

    Trotzdem bekomme ich diese Fehlermeldung vom Linker und weiß leider nicht warum er das macht.

    Ich kann doch Variablen aus dem Namensraum knut in callMe() benutzen wenn ich den Namensraum angebe oder???



  • Division_By_Zero schrieb:

    Nee, die Definition steht nicht in der Header-Datei sondern in der entsprechenden Implementations-Datei.

    Trotzdem bekomme ich diese Fehlermeldung vom Linker und weiß leider nicht warum er das macht.

    Dann zeig doch mal etwas mehr Code - inklusive der Aufteilung der einzelnen Dateien.

    Ich kann doch Variablen aus dem Namensraum knut in callMe() benutzen wenn ich den Namensraum angebe oder???

    Ja, kannst du. Aber ob eine C-Funktion etwas mit dem Namensraum knut anfangen kann (oder mit C++-Konzepten wie statischen Membern oder friend-Deklarationen), ist die andere Frage.



  • Nun habe ich mal ein kleines Test-Progrämmchen geschrieben.

    void foo();
    
    namespace Nobody
    {
    
    	class C
    	{
    		public:
    			friend void ::foo( char c );
    
    		private:
    			double x, y;
    			static char z;
    	};
    
    }
    
    char Nobody::C::z = 'Z';
    
    void foo( char c ) {
    
    	cout << "\t this is " << Nobody::C::z << endl;
    
    	Nobody::C::z = c;
    
    	cout << "\t this is " << Nobody::C::z << endl;
    
    }
    
    int main() {
    
    	char a = 'q';
    	foo( a );
    	return 0;
    }
    

    Folgende Fehlermeldung:
    test_namespace.cpp:13: error: void foo(char)' should have been declared inside::'

    Habe schon gegoogelt, aber nix gefunden was mir geholfen hätte.
    Hat jemand eine Idee???



  • Du hast zwei überladene Versionen von foo() - die parameterlose am Anfang ist nicht definiert (und wird später auch nicht verwendet), die mit einem char-Parameter hast du als friend angegeben, aber vorher nicht deklariert.



  • Sorry, ich war blind!
    Danke. Ich sitze wohl schon zu lange vor dem Flimmerkasten hier.
    Muss wohl mal nen Päuschen machen.


Anmelden zum Antworten