Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 286 — #324<br />
✐<br />
Capítulo 10. Control de nombres<br />
Dado que este espacio de nombres también se introduce con una directiva u-<br />
sing, existe la posibilidad de t<strong>en</strong>er una colisión. De todos modos, la ambigüedad<br />
aparece <strong>en</strong> el mom<strong>en</strong>to de utilizar el nombre, no <strong>en</strong> la directiva using:<br />
//: C10:OverridingAmbiguity.cpp<br />
#include "NamespaceMath.h"<br />
#include "NamespaceOverriding2.h"<br />
void s() {<br />
using namespace Math;<br />
using namespace Calculation;<br />
// Everything’s ok until:<br />
//! divide(1, 2); // Ambiguity<br />
}<br />
int main() {} ///:~<br />
Por tanto, es posible escribir directivas using para introducir un número de espacios<br />
de nombre con nombres conflictivos sin producir ninguna ambigüedad.<br />
La declaración using<br />
Puede inyectar nombres de uno <strong>en</strong> uno <strong>en</strong> el ámbito actual utilizando una declaración<br />
using. A difer<strong>en</strong>cia de la directiva using, que trata los nombres como<br />
si hubies<strong>en</strong> sido declarados globalm<strong>en</strong>te para ese ámbito, una declaración using<br />
es una declaración d<strong>en</strong>tro del ámbito actual. Eso significa que puede sobrescribir<br />
nombres de una directiva using:<br />
//: C10:UsingDeclaration.h<br />
#ifndef USINGDECLARATION_H<br />
#define USINGDECLARATION_H<br />
namespace U {<br />
inline void f() {}<br />
inline void g() {}<br />
}<br />
namespace V {<br />
inline void f() {}<br />
inline void g() {}<br />
}<br />
#<strong>en</strong>dif // USINGDECLARATION_H ///:~<br />
La declaración using simplem<strong>en</strong>te da el nombre completam<strong>en</strong>te especificado<br />
del id<strong>en</strong>tificador pero no da información de tipo. Eso significa que si el espacio de<br />
nombres conti<strong>en</strong>e un grupo de funciones sobrecargadas con el mismo nombre, la<br />
declaración using declara todas las funciones pert<strong>en</strong>eci<strong>en</strong>tes al grupo sobrecargado.<br />
Es posible poner una declaración using <strong>en</strong> cualquier sitio donde podría ponerse<br />
una declaración normal. Una declaración using funciona de la misma forma que<br />
cualquier declaración normal salvo por un aspecto: puesto que no se le da ninguna<br />
lista de argum<strong>en</strong>tos, una declaración using puede provocar la sobrecarga de una<br />
función con los mismos tipos de argum<strong>en</strong>tos (cosa que no está permitida por el procedimi<strong>en</strong>to<br />
de sobrecarga normal). De todas formas, esta ambigüedad no se muestra<br />
hasta el mom<strong>en</strong>to de uso, no apareci<strong>en</strong>do <strong>en</strong> el instante de declaración.<br />
Una declaración using puede también aparecer d<strong>en</strong>tro de un espacio de nombres<br />
y ti<strong>en</strong>e el mismo efecto que <strong>en</strong> cualquier otro lugar (ese nombre se declara d<strong>en</strong>tro<br />
286<br />
✐<br />
✐<br />
✐<br />
✐