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
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
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
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