2010-02-13 20 views
6

Así que estaba haciendo algunos ejercicios simples de C++ y noté una hazaña interesante. Reducido a un metal desnudo podría probar compilar el código siguiente:palabra clave "agradable" en C++?

class nice 
{ 
    public: 
    nice() {} 
}; 

int main() 
{ 
    nice n; 
    return 0; 
}; 

El resultado es un error de compilación que dice algo como esto:

<file>.cpp: In function ‘int main()’: 
<file>.cpp:11: error: expected `;' before ‘n’ 
<file>.cpp:11: warning: statement is a reference, not call, to function ‘nice’ 
<file>.cpp:11: warning: statement has no effect 

Y esto estaba usando g regulares ++ en Max OS X , algunos de mis amigos también han intentado con Ubuntu, obteniendo el mismo resultado.

La hazaña parece estar en la palabra "agradable", porque la refabricación nos permite compilar. Ahora, no puedo encontrar el "buen" en los listados de palabras clave para C++ o C, así que me preguntaba si alguien aquí tenía una idea.

También, poniendo

class nice n; 

en lugar de

nice n; 

corrige el problema.

P.S. Soy un novato relativo a C++ y procedo del mundo de ActionScript/.NET/Java/Python.

Actualización:

derecho, mi mal, yo también tenía un

#include <iostream> 

en la parte superior, lo que parece ser la raíz del problema, ya que sin ella todo funciona muy bien.

+0

La raíz del problema no es '#include ', sino 'using namespace std'! – James

+0

@Autopulated: no creo que sea un namespace std, es un choque con el espacio de nombres global. está tirando en y está en conflicto con :: nice() – Duck

+0

Parece que es el espacio de nombres "estándar", como mucha gente ha dicho. Una vez que confirme eso, marque una de esas respuestas como "aceptada" (la marca de verificación verde) en lugar de una que no sea realmente una respuesta. – MatrixFrog

Respuesta

3

Es un problema de espacio de nombres pero no con namespace std. La cabecera <iostream> está tirando en <unistd.h>

Si intenta

class nice 
{ 
    public: 
     nice() {}; 
}; 

int main(int argc, char *argv[]) 
{ 
    nice n; 

    return 0; 
} 

no hay ningún problema.

sólo tiene que añadir

#include <unistd.h> 

y obtendrá el "esperado‘;’antes de‘n’" error. Namespace std no entra en la imagen.

Así que la solución es la misma que antes - poner clase agradable en su propio espacio de nombres y no chocará con el global :: nice().

2

Funciona bien para mí. ¿Intentó el código exacto que publicó?

+1

Derecha, no, tuve un #include en la parte superior :) eso es probablemente. – oleks

17

Quizás el problema se deba de alguna manera a la función nice en libc. Es similar a tratar de nombrar su clase printf.

4

using namespace std, por casualidad?

Editar:

La norma dice que las cabeceras estándar definen todos sus símbolos en namespace std (véase 17.4.1.2.4). Una nota al pie, sin embargo, también dice que el < .h> variantes vierten sus nombres en el espacio de nombres global - pero por supuesto nadie debe ser el uso de estos;)

+0

La nota al pie se refiere a las variantes ''; los heredados de C. No existe la variante .h de '' en ISO C++. Sin embargo, una implementación puede proporcionar uno, ya que el nombre del encabezado no está reservado por ISO C++ – MSalters

+0

@MSalters sí, exactamente: no es un encabezado c, por lo tanto, no pone símbolos * any * en el espacio de nombres global. – James

3

Pruebe esta versión:

#include <iostream> 

namespace test 
{ 
    class nice 
    { 
    public: 
     nice() {} 
    }; 
}; 

using namespace std; 

int main() 
{ 
    test::nice n; 
    cout << "well I think this works." << endl; 
    return 0; 
} 

En En este caso, he definido mi propio espacio de nombres test. Al hacerlo, puedo usar cualquier nombre de clase que me guste, incluidas las funciones ya definidas como printf. Las únicas cosas que no puedo volver a utilizar son palabras reservadas como int o namespace.

Nota: si usted dice:

using namespace test; 

también y se refieren a nice solos, obtendrá este error:

nice.cpp: In function ‘int main()’: 
nice.cpp:18: error: reference to ‘nice’ is ambiguous 
/usr/include/unistd.h:593: error: candidates are: int nice(int) 
nice.cpp:7: error:     class test::nice 

Lo que creo que explica muy bien lo que está pasando - agradable ahora existe en dos espacios de nombres y el compilador no puede determinar a cuál te refieres.

+0

En caso de que alguien tenga curiosidad (como yo), aquí hay información sobre la función std :: nice() http://www.gnu.org/software/libc/manual/html_node/Traditional-Scheduling-Functions.html# Traditional-Scheduling-Functions (desplácese hacia abajo) – MatrixFrog

+0

Sí, niceness es un valor utilizado por el kernel de Linux para fines de programación. Se me acaba de ocurrir que para eso es para ... –

+0

nice() is * not * en std, es global. – Duck