2011-07-12 12 views
5

¿Por qué es esto?C++ espacio de nombres confusión - std :: vs :: vs sin prefijo en una llamada a tolower?

transform(theWord.begin(), theWord.end(), theWord.begin(), std::tolower); - no funciona transform(theWord.begin(), theWord.end(), theWord.begin(), tolower); - no funciona

pero

transform(theWord.begin(), theWord.end(), theWord.begin(), ::tolower); - ¿El trabajo

theWord es una cadena. Estoy using namespace std;

¿Por qué funciona con el prefijo :: y no con el std:: o con nada?

gracias por su ayuda.

+0

¿Qué archivos de encabezado incluye? –

+0

'# include # include # include # include # include # include # include ' – user839913

Respuesta

16

using namespace std; indica al compilador que busque los nombres no decorados (es decir, los que no tienen :: s) en std, así como el espacio de nombres raíz. Ahora, el tolower que está viendo forma parte de la biblioteca C, y por lo tanto en el espacio de nombres raíz, que siempre está en la ruta de búsqueda, pero también se puede hacer referencia explícita al ::tolower. También hay un std::tolower que toma dos parámetros. Cuando tiene using namespace std; e intenta usar tolower, el compilador no sabe a cuál se refiere, por lo que se convierte en un error.

Como tal, necesita utilizar ::tolower para especificar que desea el que está en el espacio de nombres raíz.

Esto, por cierto, es un ejemplo de por qué using namespace std; puede ser una mala idea. Hay suficientes elementos aleatorios en std (y C++ 0x agrega más) que es bastante probable que se produzcan colisiones de nombres. Le recomendaría que no use using namespace std;, y que lo use explícitamente, p. using std::transform; específicamente.

+0

Así :: tolower le dice al compilador mirada en el espacio de nombres raíz, y std :: tolower le dice al compilador que busque en el espacio de nombre estándar. ¿Es eso correcto? Y en este caso, quiero que el tolower del espacio de nombre de raíz no sea el espacio de nombre estándar. – user839913

+0

Derecha. O podría dejar de usar 'using namespace std' y tolower funcionaría correctamente :) – bdonlan

+3

Técnicamente, OP :: tolower() solo existe debido a un detalle de implementación. Para garantizar que el 'tolower' de la biblioteca C se encuentre en el espacio de nombres global, debe incluirse' 'en lugar de' '(consulte' D.5 [depr.c.cabeceras]/2') – Cubbi

Cuestiones relacionadas