2012-03-25 11 views
8

El siguiente código C++ da un error durante la compilación:¿Por qué no se pueden crear objetos sin usar class-keyword?

#include<iostream> 

using namespace std; 

class time 
{ 
     int hours; 
     int minutes; 
    public: 
     void gettime(int h, int m) 
     { hours = h; minutes = m; } 

     void puttime(void) 
     { 
      cout << hours << " hours and "; 
      cout << minutes << " minutes " << "\n"; 
     } 

     void sum(time, time); 
}; 

void time::sum(time t1, time t2) 
{ 
    minutes = t1.minutes + t2.minutes; 
    hours = minutes/60; 
    minutes = minutes % 60; 
    hours = hours + t1.hours + t2.hours; 
} 

int main() 
{ 
    time T1, T2, T3; // LINE NUMBER 32. 

    T1.gettime(2, 45); 
    T2.gettime(3, 30); 

    T3.sum(T2, T2); 

    cout << "T1 = "; T1.puttime(); 
    cout << "T2 = "; T2.puttime(); 
    cout << "T3 = "; T3.puttime(); 

    return 0; 
} 

el siguiente error, estoy consiguiendo:

habeebperwad:~/study/cpp/eb$ g++ 5.7-objects-as-arguments.cpp 
5.7-objects-as-arguments.cpp: In function ‘int main()’: 
5.7-objects-as-arguments.cpp:32:7: error: expected ‘;’ before ‘T1’ 
5.7-objects-as-arguments.cpp:34:2: error: ‘T1’ was not declared in this scope 
5.7-objects-as-arguments.cpp:35:2: error: ‘T2’ was not declared in this scope 
5.7-objects-as-arguments.cpp:37:2: error: ‘T3’ was not declared in this scope 
habeebperwad:~/study/cpp/eb$ 

Si añado clase antes de la declaración de tiempo T1, T2, T3 ; ', funciona bien.

¿Por qué no funciona sin la clase ?

+0

Qué compilador se utilizan? – Zeta

+7

Pruébalo sin 'usar namespace std;' (y calificando todo explícitamente). –

+8

Es posible que esto esté relacionado con un conflicto con 'std :: time'. – Mankarse

Respuesta

15

Tu compilador define std::time, por lo tanto, está esperando time(...); o time;. El nombre de clase time es ambiguo, por lo que se necesita la palabra clave class. Para evitar esto, no use using namespace std; ni cambie el nombre de su clase.

No olvide agregar el calificador de espacio de nombres std:: a cout si omite using namespace std;.

me recomiendan para que todas las advertencias del compilador (-Wall -Wextra en g ++) para evitar este tipo de errores en el futuro, como GCC sugiere que hay algo mal:

temp.cc:33:20: Advertencia: La expresión es una referencia, no una llamada, de la función »tiempo« [-Waddress] temp.cc:33:20: Advertencia: Expresión no tiene ningún efecto [-Wunused valor]

+0

muy buena explicación. Gracias por dar las opciones (-Wall -Wextra) para que pueda encontrar cualquier problema en el futuro. –

Cuestiones relacionadas