2009-04-29 12 views

Répondre

2

Besoin d'informations pour expliquer cette erreur. Le code suivant est très bien:

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

Ainsi, en spécifiant l'espace de noms global résout votre problème actuel, en général, il est possible de se référer à des symboles dans NSB sans elle. Sinon, vous devrez écrire :: std :: cout, :: std :: string, etc, à chaque fois que vous vous trouvez dans un autre espace de noms. Et tu ne le fais pas. QED.

La spécification de l'espace de noms global concerne les situations où un autre nsB est visible dans la portée actuelle - par exemple si nsA :: subA contient son propre espace de noms ou classe appelée nsB et que vous souhaitez appeler :: nsbB: foo plutôt que nsA :: subA :: nsB :: foo. Vous obtenez donc l'erreur que vous avez citée si, par exemple, vous avez déclaré (mais pas défini) nsA :: subA :: nsB :: theFunctionInNsB (...). Avez-vous peut-être #include l'en-tête de nsB depuis l'intérieur de l'espace de noms subA?

+0

"Avez-vous peut-être # inclus l'en-tête pour nsB de l'intérieur de l'espace de noms subA?" - En effet, j'avais. Bonne prise, et bonne explication. – mikeh

7

Utilisez la résolution de portée 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

Merci Michael - ces deux réponses à ma question parfaitement, jeffamaphone l'a eu en premier alors je vais lui donner le chèque. Votre illustration sera bonne à avoir ici pour les futurs surfeurs. – mikeh

+0

+1 pour donner un échantillon de code. Cela a rendu la réponse plus claire. –

Questions connexes