2009-04-29 5 views

Antwort

2

Sie benötigen weitere Informationen, dass Fehler zu erklären. 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 der globalen Namensraumes unter Angabe Ihr aktuelles Problem löst, im Allgemeinen ist es möglich, Symbole in NSB, ohne es zu verweisen. Andernfalls müssten Sie :: std :: cout, :: std :: string usw. schreiben, wenn Sie sich in einem anderen Namensraum befinden. Und du nicht. QED. Geben Sie den globalen Namespace für Situationen an, in denen im aktuellen Gültigkeitsbereich ein anderes nsB sichtbar ist, z. B. wenn nsA ​​:: subA einen eigenen Namespace oder eine Klasse namens nsB enthält und Sie :: nsbB: foo statt nsA aufrufen möchten :: subA :: nsB :: foo. Sie erhalten also den Fehler, den Sie angeben, wenn Sie beispielsweise (aber nicht definiert) nsA :: subA :: nsB :: theFunctionInNsB (...) deklariert haben. Hast du vielleicht den Header für nsB aus dem Namespace subA übernommen?

+0

"Hast du vielleicht den Header für nsB aus dem Namespace subA übernommen?" - In der Tat, ich hatte. Toller Fang und gute Erklärung. – mikeh

7

Nutzung globale Reichweite Auflösung:

::nsB::TheFunctionInNsB() 
5
#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; 
} 
+0

Danke Michael - beide antworten meine Frage perfekt, jeffamaphone bekam es zuerst, also gebe ich ihm den Scheck. Ihre Illustration wird gut für zukünftige Surfer hier sein. – mikeh

+0

+1 für das Geben eines Codebeispiels. Das hat die Antwort klarer gemacht. –