2012-03-25 15 views
8

Poniższy kod C++ daje błąd podczas kompilacji:Dlaczego obiektów nie można utworzyć bez użycia słowa kluczowego class?

#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; 
} 

następujący błąd, otrzymuję:

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$ 

Jeśli dodać klasę przed stwierdzeniem „czas T1, T2, T3 ; ", działa dobrze.

Dlaczego nie działa bez klasy ?

+0

które kompilatora używasz? – Zeta

+7

Wypróbuj bez 'using namespace std;' (i jawnie zakwalifikuj wszystko). –

+8

Jest możliwe, że jest to związane z konfliktem z 'std :: time'. – Mankarse

Odpowiedz

15

Twój kompilator definiuje std::time, więc oczekuje się albo time(...); lub time;. Nazwa klasy time jest niejednoznaczna, dlatego potrzebne jest słowo kluczowe class. Aby temu zapobiec, nie używaj numeru using namespace std; lub zmień nazwy swojej klasy.

Nie zapomnij dodać kwalifikatora obszaru nazw std:: do cout, jeśli zrzucisz using namespace std;.

polecam włączyć wszystkie ostrzeżenia kompilatora (-Wall -Wextra w g ++), aby uniknąć takich błędów w przyszłości, jako wskazówki GCC, że coś jest nie tak:

temp.cc:33:20: ostrzeżenie: wyrażenie jest odwołanie, a nie wezwanie, z funkcją »czas« [-Waddress] temp.cc:33:20: Uwaga: Wyrażenie nie ma wpływu [-Wunused wartość]

+0

bardzo dobre wytłumaczenie. Dziękuję za udostępnienie opcji (-Wall-Wextra), aby w przyszłości móc znaleźć jakiś problem. –

Powiązane problemy