Wie kann ich mich auf eine externe C++ - namespace innerhalb einer geschachtelten ein?

StackOverflow https://stackoverflow.com/questions/803506

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe zwei namespaces definiert im Standard - /" - root-namespace", nsA und nsB. nsA hat ein sub-namespace, nsA::subA.Wenn ich versuche, verweisen auf eine Funktion, die gehört zu nsB, von innen nsA::subA, Bekomme ich einen Fehler:

undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'

Irgendwelche Ideen?

War es hilfreich?

Lösung

Brauchen mehr Informationen, um zu erklären, dass Fehler.Der folgende code ist in Ordnung:

#include <iostream>

namespace nsB {
    void foo() { std::cout << "nsB\n";}
}

namespace nsA {
    void foo() { std::cout << "nsA\n";}
    namespace subA {
        void foo() { std::cout << "nsA::subA\n";}
        void bar() {
            nsB::foo();
        }
    }
}

int main() {
    nsA::subA::bar();
}

So, während die Angabe der Globale namespace löst dein Aktuelles problem, in der Regel ist es möglich zu finden die Symbole in der nsB ohne es.Andernfalls müssten Sie schreiben ::std::cout, ::std::string, etc, wenn Sie wurden in einen anderen namespace-Gültigkeitsbereich.Und Sie nicht.QED.

Die Angabe der Globale namespace ist für Situationen, in denen es ein anderes nsB im aktuellen Gültigkeitsbereich sichtbar - zum Beispiel, wenn die nsA::subA enthaltenen seine eigenen namespace oder eine Klasse namens nsB, und Sie möchten, rufen Sie ::nsbB:foo, anstatt nsA::subA::nsB::foo.So würden Sie erhalten die Fehlermeldung, die Sie zitieren, wenn Sie zum Beispiel erklärt haben (aber nicht definiert) nsA -:: subA::nsB::theFunctionInNsB(...).Hast du vielleicht #include die header für die nsB von innen namespace subA?

Andere Tipps

Verwenden globalen Bereich Auflösung:

::nsB::TheFunctionInNsB()
#include <stdio.h>

namespace nsB {
    void foo() {
        printf( "nsB::foo()\n");
    }
}

namespace nsA {
    void foo() {
        printf( "nsA::foo()\n");
    }

    namespace subA {
        void foo() {
            printf( "nsA::subA::foo()\n");
            printf( "calling nsB::foo()\n");

            ::nsB::foo();      // <---  calling foo() in namespace 'nsB'
        }
    }
}

int main()
{
    nsA::subA::foo();

    return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top