2016-07-26 16 views
0

Ich versuche, ein Programm über Makefile zu kompilieren. Wenn ich machen von der Kommandozeile starten gibt der Compiler mir diesen Fehler:(Klasse) nennt keinen Typ

g++ -Wall -g -c main.cpp -std=c++11 
In file included from main.cpp:9:0: 
athlete.h:9:9: error: 'string' does not name a type 
     string name; 

ich schon versucht habe, zu suchen und ich habe festgestellt, dass einige häufig gestellte Fragen zu fehlenden #include <string> verwandt waren, „invertiert Präprozessordirektiven“, schlechte Verwendung von using namespace std; oder schlechte Verwendung von #includes in anderen Header-Datei. Ich habe versucht, diese 4 Punkte zu beheben, aber ohne Ergebnisse, vielleicht übersehen ich etwas. Diese Frage zu hoffen, wird Sie nicht langweilen. Vielen Dank. Unterhalb einiger Blöcke des Dateicodes (sind nicht alle Dateien enthalten).

main.cpp

#include <iostream> 
#include <fstream> 
#include <ctime> 
#include <iomanip> 
#include <string> 
#include <cstring> 
#include <stdio.h> 
#include <stdlib.h> 
#include "athlete.h" 
#include "upd_at.h" 

using namespace std; 

int main(){ 
    Athlete f; 
    f.set_generalities(); 
    f.set_perfind(); 
    f = update_test_res(f); 

    return 0; 
} 

athlete.h

"...." bedeutet: (hoffentlich) nicht relevanten Zeilen Code.

#ifndef ATHLETE_H_INCLUDED 
#define ATHLETE_H_INCLUDED 


//declarations of Athlete 
class Athlete{ 
private: 
    //generalities 
     string name; 
     int age; 
     int height; 
     double weight; 
     int tr_exp; 
     .... 
public: 
     .... 
}; 
#endif // ATHLETE_H_INCLUDED 

athlete.cpp

void Athlete::set_generalities(){ 
    string in_name; 
    int in_age; 
    int in_height; 
    double in_weight; 
    int in_tr_exp; 
    .... 
} 
void Athlete::set_perfind(){ 
    int in_RHR, in_maxHR; 
    double in_1rmsq, in_1rmbp, in_1rmcl, in_1rmdl, hndgrp; 
    .... 
    return ; 
} 
//create a first txt with athlete generalities and tests column 
void create_ath_file(){ 
// current time/date based on current system 
    time_t now = time(0); 
    tm *ltm = localtime(&now); 
    const char* name_pt = name.c_str(); 
    ofstream myfile; 
    myfile.open(name_pt); 
    .... 
    myfile.close(); 
} 

Make-Datei

p1: main.o upd_athlete.o athlete.o 
    g++ -Wall -g main.o upd_athlete.o athlete.o -o p1 -std=c++11 

main.o: main.cpp athlete.h athlete.cpp upd_at.h upd_athlete.cpp 
    g++ -Wall -g -c main.cpp -std=c++11 

upd_athlete.o: upd_athlete.cpp upd_at.h athlete.cpp athlete.h 
    g++ -Wall -g -c upd_athlete.cpp -std=c++11 

athlete.o: athlete.cpp athlete.h 
    g++ -Wall -g -c athlete.cpp -std=c++11 

clean: 
    \rm *.o 

Antwort

3

Sie müssen entweder:

  • verwenden using namespace std; in athlete.h
  • bewegen using namespace std; in main.cpp vor #include "athlete.h"

Und dies sind nur sehr schlecht Hacks. std::string name im athlete.h -

  • string zu qualifizieren. std:: ist nicht so schwer zu tippen, während wir dabei sind, also würde ich using namespace std; nirgends verwenden.

Außerdem sollten Sie die entsprechenden Standard-Header direkt an den athlete.h#include, sonst sind Sie nur unter Berufung dass der Benutzer und athlete.cpp tut dies vor athlete.h Inklusion.

+0

Lassen Sie mich wissen, wenn ich verstanden habe: A) löschen 'using namespace std;' B) füge 'std ::' nur in der Header-Datei hinzu. C) Was meinst du mit Standard-Headern? Ich benutze in main.cpp? Danke für deine Antwort. – ikeDiM

+0

Sie werden Tonnen von ''string' erhalten, die keine type-ähnlichen Fehler nennen, nachdem ** alle Vorkommnisse von' using namespace std; '** entfernt wurden, und Sie werden sie beheben, indem Sie' std :: 'voranstellen. Ja, diejenigen, die Sie in 'main.cpp' haben, sind Standard-C++ - Header (abgesehen von '* .h' Einsen, das sind C und C++ verwendet' c * 'Benennung). Außerdem sollten Sie sich fragen, ob Sie alle brauchen.Es gibt viele '# include's. – LogicStuff

+0

Danke, es hat funktioniert. Aber trotzdem kann ich nicht fertig kompilieren. Jetzt ist das Problem: "Athlet" nennt keinen Typ. Sollte ich athlet.h (Kopfzeile, die Klasse Athlet definiert) einbeziehen, überall wo ich diese Klasse brauche oder gibt es eine Lösung wie std ::? – ikeDiM

1

Verwenden Sie std :: string anstelle von string.

+1

Du siehst ein wenig jung aus, um auf Stack Overflow zu sein! –

+0

Es ist mein Kindheit Bild. Ich bin bereits Ingenieur, der Job in der Software-Programmierung macht. –