friend + namespace -> richtiger Syntax ?



  • Tag zusammen,
    kurze Frage:
    Wie lautet der korrekte Syntax für die friend decleration ?

    namespace MyNamespace
    {
    
    class Test
    {
    private:
    
    	friend std::ostream& operator<<( std::ostream& ostream, const MyNamespace::Test& object );		
    
    	unsigned int m_a;
    };
    
    }
    
    std::ostream& operator<<( std::ostream& ostream, const MyNamespace::Test& object )	
    {
    	ostream << object.m_a;
    
    	return ostream;
    }
    

    Ohne den namespace klappts, nur mit nicht... 😕



  • #include <iostream>
    using namespace std;
    
    namespace MyNamespace
    {
    
    class Test
    {
    private:
    
        friend std::ostream& operator<<( std::ostream& ostream, const MyNamespace::Test& object );       
    
        unsigned int m_a;
    };
    
    std::ostream& operator<<( std::ostream& ostream, const MyNamespace::Test& object )   
    {
        ostream << object.m_a;
    
        return ostream;
    }
    
    }
    
    int main() {
        MyNamespace::Test t;
        cout<<t<<endl;
    }
    

    Das klappt bei mir ohne Probleme. Was willst du genau erreichen?



  • Ich möchte die Funktion im globalen namespace haben. In deinem Beispiel ist sie ja in den "MyNamespace" gerutscht ?



  • Der Gast schrieb:

    Ich möchte die Funktion im globalen namespace haben. In deinem Beispiel ist sie ja in den "MyNamespace" gerutscht ?

    Ich weis nicht, ob das überhaupt geht. Mir fällt nichts ein. Warum willst du das?



  • Der Gast schrieb:

    Ich möchte die Funktion im globalen namespace haben.

    dann deklariere sie (vorher) im globalen namespace.

    nur: warum würdest du das tun wollen?



  • Vielleicht gehts ja indem du explizit sagst dass es nicht MyNamespace::operator<< sonder ::operator<< ist: (habs nicht ausprobiert)
    Dennoch solltst du alles was zusammengehört auch in den selben ns legen, und der op<< gehört nunmal zum Interface der Klasse und damit in den gleichen ns.

    namespace MyNamespace
    {
    
    class Test
    {
    private:
    
    	friend std::ostream& ::operator<<( std::ostream& ostream, const MyNamespace::Test& object );		// ::operator<<
    
    	unsigned int m_a;
    };
    
    }
    


  • pumuckl schrieb:

    Vielleicht gehts ja indem du explizit sagst dass es nicht MyNamespace::operator<< sonder ::operator<< ist: (habs nicht ausprobiert)

    operator<< muss vorher im globalen namespace deklariert worden sein (ansonsten wäre das ill-formed, weil diese form von friend-deklaration keine namen einführen kann (in kein scope, auch nicht versteckt))

    Dennoch solltst du alles was zusammengehört auch in den selben ns legen, und der op<< gehört nunmal zum Interface der Klasse und damit in den gleichen ns.

    das meine ich auch.


Anmelden zum Antworten