2010-04-05 4 views
5

Disculpe esta tonta pregunta, pero ¿hay alguna manera de restringir las directivas using al archivo actual para que no se propaguen a los archivos que #include este archivo?Restringir directivas `using` al archivo actual

+0

Puede restringir el uso de directivas a un alcance que no sea de archivo, como un espacio de nombres o una función. –

+2

Es mucho mejor no aplicar la directiva 'using' en los encabezados. –

+0

@David: odio escribir algo así como 'std :: map >' cuando puedo escribir 'map >' . – missingfaktor

Respuesta

4

Tal vez al envolver el código que se incluirá dentro de su propio espacio de nombre podría lograr el comportamiento
que desea, ya que los espacios de nombres tienen alcance.

// FILENAME is the file to be included 
namespace FILENAME_NS { 
    using namespace std; 
    namespace INNER_NS { 
     [wrapped code] 
    } 
} 
using namespace FILENAME_NS::INNER_NS; 

y en algún otro archivo

#include <FILENAME> 
// std namespace is not visible, only INNER_NS definitions and declarations 
... 
+0

¡Ey, buen truco! Creo que iré por este; ¡Muchas gracias! :) – missingfaktor

15

No, no existe, por lo que no debe usar el uso de directivas en archivos de encabezado ni en ningún otro archivo que # incluya.

+3

Para extender esto un poco, el preprocesador (que maneja '# include' y otros' # '-comandos) se ejecuta antes de que el compilador vea el código. La directiva 'using' y cualquier otra palabra clave estándar son procesadas por el compilador. Por lo tanto, en lo que respecta al compilador, los archivos de encabezado no son archivos separados, sino que son el código que está en cada archivo en el que están '# include''d, y por lo tanto también lo son los' que usan' directivas que puede poner en ellos. – Amber

+2

Aah ... triste. Gracias por la respuesta de todos modos. – missingfaktor

+0

@Rahul No es tan malo: puede (y debería), por supuesto, usar directivas 'using' en sus archivos .cpp. –

4

Técnicamente usted debe ser capaz de importar a algún espacio de nombres interno, y luego hacer las cosas declaradas en que visible en el espacio de nombres significado para el usuario.

#ifndef HEADER_HPP 
#define HEADER_HPP 

#include <string> 

namespace my_detail 
{ 
    using std::string; 
    inline string concatenate(const string& a, const string& b) { return a + b; } 
} 

namespace my_namespace 
{ 
    using my_detail::concatenate; 
} 

#endif 

#include <iostream> 
#include "header.hpp" 

using namespace my_namespace; 

int main() 
{ 
    std:: //required 
    string a("Hello "), b("world!"); 
    std::cout << concatenate(a, b) << '\n'; 
} 

No estoy seguro si vale la pena y lo bien que juega con "búsqueda argumento dependientes".

+0

Demasiado problemas. Pero sigue siendo un buen trabajo. Entonces, +1. :) – missingfaktor

Cuestiones relacionadas