2012-03-25 11 views
8

Der folgende C++ Code gibt einen Fehler beim Kompilieren:Warum können Objekte nicht ohne Verwendung eines Klassenschlüsselworts erstellt werden?

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

Der folgende Fehler, erhalte ich:

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$ 

Wenn ich Klasse vor der Anweisung ‚Zeit T1, T2, T3 hinzufügen ; ', es funktioniert gut.

Warum funktioniert es nicht ohne die Klasse?

+0

Welche Compiler verwenden Sie? – Zeta

+7

Probieren Sie es aus, ohne namespace std; zu verwenden (und qualifizieren Sie alles explizit). –

+8

Es ist möglich, dass dies mit einem Konflikt mit 'std :: time' zusammenhängt. – Mankarse

Antwort

15

Ihr Compiler definiert std::time und erwartet daher entweder time(...); oder time;. Der Klassenname time ist nicht eindeutig, daher wird das Schlüsselwort class benötigt. Um dies zu verhindern, verwenden Sie nicht using namespace std; oder benennen Sie Ihre Klasse um.

Vergessen Sie nicht, den Namespacequalifikator std:: zu cout hinzuzufügen, wenn Sie using namespace std; löschen.

Ich empfehle alle Compiler-Warnungen (-Wall -Wextra in g ++) zu ermöglichen, solche Fehler in Zukunft zu verhindern, wie GCC deutet an, dass es etwas falsch:

temp.cc:33:20: Achtung: Der Ausdruck ist eine Referenz, kein Anruf, der Funktion »Zeit« [-Waddress] temp.cc:33:20: Achtung: Expression keinen Effekt [-Wunused-Wert] hat

+0

sehr gute Erklärung. Danke, dass ihr die Optionen (-Wall -Wextra) gegeben habt, damit ich in Zukunft jedes Problem herausfinden kann. –

Verwandte Themen