2009-04-29 13 views
5

Tengo dos espacios de nombres definidos en el espacio de nombres predeterminado/"raíz", nsA y nsB. nsA tiene un espacio de nombres secundario, nsA :: subA. Cuando intento hacer referencia a una función que pertenece a NSB, desde el interior de la NSA :: subA, me sale un error:¿Cómo hago referencia a un espacio de nombres externo de C++ desde uno anidado?

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

¿Alguna idea?

Respuesta

2

necesita más información para explicar ese error. El siguiente código está 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(); 
} 

Así, mientras que especifica el espacio de nombres global resuelve su problema actual, en general, es posible hacer referencia a símbolos de NSB sin ella. De lo contrario, tendría que escribir :: std :: cout, :: std :: string, etc., siempre que estuviera en otro ámbito de espacio de nombres. Y tu no. QED.

Especificar el espacio de nombre global es para situaciones donde hay otra nsB visible en el ámbito actual; por ejemplo, si nsA :: subA contiene su propio espacio de nombre o clase llamado nsB y desea llamar a :: nsbB: foo en lugar de nsA :: subA :: nsB :: foo. Entonces obtendría el error que cita si, por ejemplo, ha declarado (pero no definido) nsA :: subA :: nsB :: theFunctionInNsB (...). ¿Quizás incluyes # el encabezado para nsB desde dentro del espacio de nombres subA?

+0

"¿Quizás incluiste # el encabezado para nsB desde dentro del espacio de nombres subA?" - de hecho, tuve. Gran captura, y buena explicación. – mikeh

7

Uso de resolución de ámbito mundial:

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

Gracias Michael - ambos responden perfectamente a mi pregunta, jeffamaphone lo recibió primero así que le daré el cheque. Su ilustración será buena para tener aquí para futuros surfistas. – mikeh

+0

+1 para dar una muestra de código. Eso hizo que la respuesta sea más clara –

Cuestiones relacionadas