13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!