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