Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


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