[gelöst]Bezeichner nicht definiert?!



  • @Daniel-l06
    Naja es ist eben nicht das selbe.

    Ich vermute mal es liegt daran:

    class Vector {
    public:
        friend void vecFriend(Vector const& vec) {
        }
    };
    
    class Matrix {
    public:
        friend void matrixFriend(Vector const& vec) {
        }
    };
    
    int main() {
        Vector vec;
        vecFriend(vec); // geht
        matrixFriend(vec); // geht nicht
        // und
        auto x = &vecFriend; // geht nicht
        auto y = &matrixFriend; // geht nicht
    }
    

    Grund: eine "friend declaration" einer Funktion ist nicht das selbe wie eine Deklaration der Funktion im umgebenden Namespace - egal ob die Funktion dabei auch implementiert wird oder nicht. Eine normale Deklaration ... naja deklariert die Funktion eben in dem Namespace wo sie erfolgt. D.h. die kann dann in diesem Namespace ganz normal gefunden werden.

    Eine "friend declaration" einer Funktion ermöglicht allerdings NUR das Auffinden der Funktion über ADL (=argument dependent lookup aka. Koenig lookup) -- und das auch nur wenn eines der Argumente genau die Klasse ist in der die "friend declaration" auftaucht (bzw. eine davon abgeleitete Klasse) -- es reicht NICHT wenn eines der Argumente im selben Namespace ist wie die Klasse in der die "friend declaration" steht!

    Beim Aufruf von vecFriend funktioniert das, weil das erste und einzige Argument ein Vector ist. D.h. hier findet ADL für Vector statt, und das findet dann vecFriend weil vecFriend ja ein friend von Vector ist.

    Beim Aufruf von matrixFriend geht es nicht, weil das erste und einzige Argument wieder ein Vector ist. D.h. es findet wieder ADL für Vector statt. Das findet aber nichts, denn: matrixFriend lebt zwar im selben Namespace wie Vector, aber es ist lediglich über eine "friend declaration" bekannt gemacht worden -- und diese "friend declaration" steht nicht in Vector. Also wird matrixFriend über ADL für Vector nicht gefunden und du bekommst einen Fehler.

    Und die beiden Zeilen

        auto x = &vecFriend; // geht nicht
        auto y = &matrixFriend; // geht nicht
    

    demonstrieren dass keine der beiden Funktionen ganz ohne ADL gefunden werden.

    Die Lösung ist die Funktionen nochmal ausserhalb der Klasse zu deklarieren. So wie @Th69 dir das vorgeschlagen hat.

    Ich hab die Zeile hat nochmal in meine main geschrieben und dann hat es funktioniert.

    Du solltest die Zeile nicht "in deine main" schreiben (was übrigens zweideutig ist, du könntest dein main.cpp File oder deine main Funktion meinen). Sondern besser in Matrix.h direkt hinter die Definition der CMyMatrix Klasse.



  • @hustbaer Ah super, das hat mir sehr weiter geholfen! Der Tutor gestern konnte mir leider nicht erklären warum das so war, hat mir aber auch vorgeschlagen die Funktion einfach nochmal direkt hinter der .h zu deklarieren.
    Daher vielen lieben Dank für deine ausführliche Erklärung, hätte sonst nochmal den Kontakt zum Professor gesucht :'D

    Grüße
    Daniel


Anmelden zum Antworten