sirve - ¿Puedo deshacer el efecto de "usar el espacio de nombres" en C++?
using declarations c++ (5)
Como otros dijeron, no se puede y el problema no debería estar allí en primer lugar.
Lo mejor que puede hacer es traer sus símbolos necesarios para que sean preferidos por la búsqueda del nombre:
namespace A { class C {}; }
namespace B { class C {}; }
using namespace A;
using namespace B;
namespace D {
using A::C; // fixes ambiguity
C c;
}
En algunos casos, también puede envolver las inclusiones ofensivas con un espacio de nombres:
namespace offender {
# include "offender.h"
}
Con el using namespace
hago que todo el contenido de ese espacio de nombres sea visible directamente sin usar el calificador del espacio de nombres. Esto puede causar problemas si se using namespace
en los encabezados ampliamente utilizados: podemos hacer involuntariamente dos espacios de nombres con nombres de clases idénticos visibles y el compilador se negará a compilar a menos que el nombre de la clase esté antepuesto con el calificador del espacio de nombres.
¿Puedo deshacer el using namespace
para que el compilador olvide que lo vio anteriormente?
No que yo sepa ... Pero como regla, solo uso "usar el espacio de nombres" en los archivos .cpp.
No, C ++ Standard no dice nada sobre "deshacer". Lo mejor que se te permite hacer es limitar el alcance del using
:
#include <vector>
namespace Ximpl {
using namespace std;
vector<int> x;
}
vector<int> z; // error. should be std::vector<int>
Pero desafortunadamente al using namespace Ximpl
traerá todos los nombres del espacio de using namespace Ximpl
también.
No, pero puede decirle a sus compañeros de trabajo que nunca debe tener una directiva o declaración de uso en un encabezado.
El más cercano, que intentaré usar en los archivos de encabezado, es el siguiente:
//example.h
#ifndef EXAMPLE_H_
#define EXAMPLE_H_
/**
* hating c++ for not having "undo" of using namespace xx
*/
#define string std::string
#define map std::map
class Example {
public:
Example (const char *filename);
Example (string filename);
~Example ();
private:
map<string,complicated_stuff*> my_complicated_map;
};
#undef string
#undef map
#endif //EXAMPLE_H_
después de todo, define son #undef -able. Hay 2 problemas: 1. es feo 2. se usan #define y #undef separados para cada nombre del espacio de nombres correspondiente