¿Cómo hago referencia a un espacio de nombres C ++ externo desde uno anidado?
-
03-07-2019 - |
Pregunta
Tengo dos espacios de nombres definidos en la raíz predeterminada / " raíz " espacio de nombres, nsA y nsB . nsA tiene un espacio de nombres, nsA :: subA . Cuando intento hacer referencia a una función que pertenece a nsB , desde dentro de nsA :: subA , aparece un error:
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
¿Alguna idea?
Solución
Necesito 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();
}
Por lo tanto, si bien la especificación del espacio de nombres global resuelve su problema actual, en general es posible referirse a los símbolos en nsB sin él. De lo contrario, tendría que escribir :: std :: cout, :: std :: string, etc., cuando estuviera en otro ámbito de espacio de nombres. Y tu no QED.
La especificación del espacio de nombres global es para situaciones donde hay otro nsB visible en el ámbito actual, por ejemplo, si nsA :: subA contenía su propio espacio de nombres o clase llamada nsB, y desea llamar a :: nsbB: foo en lugar de nsA: : subA :: nsB :: foo. Entonces obtendrá el error que cita si, por ejemplo, ha declarado (pero no definido) nsA :: subA :: nsB :: theFunctionInNsB (...). ¿Tal vez has incluido # el encabezado de nsB dentro del espacio de nombres subA?
Otros consejos
Utilice la resolución de alcance global:
::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;
}