2009-04-29 1 views

risposta

2

bisogno di ulteriori informazioni per spiegare che l'errore. Il seguente codice va bene:

#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(); 
} 

Così, mentre specificando il namespace globale risolve il problema attuale, in generale, è possibile fare riferimento a simboli in NSB senza di essa. Altrimenti, dovresti scrivere :: std :: cout, :: std :: string, ecc, ogni volta che eri in un altro ambito di namespace. E tu no. QED.

Specificare lo spazio dei nomi globale è per le situazioni in cui è visibile un altro nsB nell'ambito corrente, ad esempio se nsA :: subA contiene il proprio spazio dei nomi o classe chiamato nsB e si desidera chiamare :: nsbB: foo piuttosto che nsA :: :: subA NSB :: foo. Quindi otterresti l'errore che citi se per esempio hai dichiarato (ma non definito) nsA :: subA :: nsB :: theFunctionInNsB (...). Hai forse #include l'intestazione per nsB dallo spazio dei nomi subA?

+0

"Forse hai #incluso l'intestazione per nsB dallo spazio dei nomi subA?" - anzi, l'ho avuto. Ottima cattura e buona spiegazione. – mikeh

7

Usa risoluzione portata globale:

::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

Grazie Michael - entrambi rispondono perfettamente alla mia domanda, jeffamaphone l'ha fatto prima, quindi gli darò l'assegno. La tua illustrazione sarà buona per avere qui per i futuri surfisti. – mikeh

+0

+1 per dare un esempio di codice. Ciò ha reso la risposta più chiara –