4.1.11d Ampliar un subespacio
§1 Los espacios de nombres pueden ser discontinuos, y están abiertos a desarrollos adicionales. Si
se redeclara un subespacio, el efecto es justamente ampliar el existente añadiéndole las nuevas declaraciones. Ejemplo:
namespace ALPHA {
long double LD;
float f(float y) { return y; }
}
...
namespace ALPHA {
int X;
char g(int i) { ... }
} // ahora ALPHA incluye las variables LD, X y las funciones f y g
§2 Un alias no puede ser usado para ampliar un subespacio. Ejemplo.
namespace ALPHA {
...
long double LD;
float f(float y) { return y; }
}
...
namespace AL = ALPHA;
...
namespace AL
{ // Error:
declaración múltiple de AL
int x;
}
§3 No obstante lo anterior, advertir que cualquier extensión de un subespacio que se haga después de una
declaración using
( 4.1.11c) puede ser
ignorada a partir del punto de la declaración. Por consiguiente, las versiones sobrecargadas de ciertas funciones deben ser
incluidas en el subespacio antes de declarar que está "en uso". Dicho en otras palabras: una vez que el
subespacio está en uso, las ampliaciones pueden ser ignoradas. Considere el siguiente ejemplo:
#include <iostream>
struct S { };
class C { };
namesace ALPHA { // declaración inicial de ALPHA
void g(struct S) {
std::cout << "Procesando una
estructura" << std::endl;
}
}
using ALPHA::g; // Se declara en uso
/* Despues de la declaración anterior, los intentos siguientes
de sobrecargar la función g() son ignorados */
namespace ALPHA { // Aquí se extiende el subespacio ALPHA
void g( C& ) { // sobrecarga de la función g
std::cout << "Procesando una clase" << std::endl;
}
}
int
main() { // ================
S mystruct; // se instancia la estructura
C myclass; // se instancia la clase
g(mystruct); // llamada correcta a la versión visible de g
// La llamada a función que sigue da error de compilación
// porque no existe una versión sobrecargada para este caso.
g(myclass); // Error!
return 0;
}
Salida:
Procesando una estructura