2016-07-26 77 views
0

我想通過makefile編譯一個程序。當我啓動命令行使編譯器給了我這個錯誤:(類)不會命名一個類型

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; 

我已經試圖尋找和我發現,一些常見的問題都與缺少#include <string>,「倒預處理指令」,在其他頭文件中使用using namespace std;或使用不良#includes。我試圖修復看這4點,但沒有結果,也許我忽略了一些東西。希望這個問題不會讓你失望。謝謝。在一些文件的代碼塊(下面並不是所有的文件都包含在內)。

的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

「....」手段:(希望)的代碼不相關的行。

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

的makefile

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 

回答

3

您需要要麼:

  • #include "athlete.h"

athlete.h

  • main.cpp移動using namespace std;使用using namespace std;現在這些都只是非常糟糕的黑客。

    • 資格string - std::string nameathlete.hstd::在我們處於打字狀態時並不難,所以我不會在任何地方使用using namespace std;

    此外,你應該直接#include適當的標準頭的athlete.h,否則你只是依靠用戶和athlete.cpp以前athlete.h包容這樣做。

  • +0

    讓我知道如果我明白了:A)刪除'using namespace std;' B)只在頭文件中添加'std ::'。 C)你的標準頭文件是什麼意思?我在main.cpp中使用的?感謝您的回答。 – ikeDiM

    +0

    你會得到大量的''字符串'在刪除所有'使用名稱空間標準符號''**的事件後不會命名類型錯誤,並且您將通過預先加入'std ::'來修復它們。是的,你在main.cpp中擁有的是標準的C++頭文件(除了* .h'之外,那些是C和C++使用'c *'命名)。此外,你應該問自己,如果你需要每一個人。有很多'#include's。 – LogicStuff

    +0

    感謝它似乎工作。但無論如何我無法完成編譯。現在的問題是:'運動員'不會命名一種類型。我是否需要在這個課程中包含athlete.h(頭文件定義班級運動員)或者有像std ::?這樣的解決方案? – ikeDiM

    1

    使用std :: string而不是字符串。

    +1

    你看起來有點年輕是堆棧溢出! –

    +0

    它是我童年的照片。我已經是工程師從事軟件編程工作了。 –