簡體   English   中英

在C ++中,unique_ptr出現錯誤之前的預期類型說明符

[英]expected type-specifier before error with unique_ptr in c++

在下面的代碼中,當我編譯時出錯:Error: main.cpp:8:57:error:'Staircase'std :: unique_ptr algodiagnostic(new Staircase())之前的預期類型說明符;

編譯命令 g ++ HardwareDiagnostic.cpp HardwareDiagnostic.h main.cpp -std = c ++ 0x -o res

如果在不單獨創建頭文件和main.cpp的情況下在單個文件中編譯整個代碼,則效果很好。 有人可以建議如何解決此問題。

//HardwareDiagnostic.h//

        #ifndef HARDWAREDIAGNOSTIC_H_
        #define HARDWAREDIAGNOSTIC_H_
        #include <iostream>
        #include <memory>
        using namespace std;
        class HardwareDiagnostic
        {

        public:
        virtual bool checkPort();
        virtual void startDiagnostic();
        virtual int publishAlgoDiagnosticInfo();
        virtual void clearErrorStatus(){cout<<"Algorithm Diagnostics"<<endl;}
        virtual ~HardwareDiagnostic() {cout<<"calling virtual destructor"<<endl;}
        };




        #endif /* HARDWAREDIAGNOSTIC_H_ */

    //HardwareDiagnostic.cpp//

    #include"HardwareDiagnostic.h"
    class Localization : public HardwareDiagnostic
    {

    public:
    Localization() { cout << "calling Localization constructor";}

    bool checkPort(){cout<<"checkport :Localization";}
    void startDiagnostic(){cout<<"start Diagnostic:Localization";}
    int publishAlgoDiagnosticInfo() {cout<<"publish Diagnostic:Localization";}
    void clearErrorStatus(){ cout<<"Localization:publish Diagnostic";}
    ~Localization () { cout<<"calling Localization destructor ";}

    };


    class Staircase : public HardwareDiagnostic
    {

    public:
    Staircase () {cout<<"Staircase constructor";}
    bool checkPort(){cout<<"Staircase";}
    void startDiagnostic(){cout<<"StairCase:start Diagnostic";}
    int publishAlgoDiagnosticInfo() {cout<<"StairCase:publish Diagnostic";}
    void clearErrorStatus(){ cout<<"staircase:publish Diagnostic";}
    ~Staircase(){cout<<"calling Staircase destructor";}
    };


//main.cpp//    

#include "HardwareDiagnostic.h"
using namespace std;
int main() {

std::unique_ptr<HardwareDiagnostic> algodiagnostic (new Staircase());
return 0;
}

當編譯器在main.cpp上運行時,它會看到Staricase的用法,但看不到Staircase類的聲明,因此會引發錯誤。 您的main.cpp文件包含標頭,該標頭僅描述了HardwareDiagnostic類,但未提供有關Staircase的信息。

好的做法是將類聲明保留在頭文件中,而不是cpp文件中,因此任何其他源都可以包括頭文件並開始使用所描述的類。 還可以在頭文件中包含一些瑣碎的類方法的定義(例如getters / setters),但是復雜的方法應該在頭文件中聲明並在coresponding cpp文件中定義。

在您的情況下,我將執行以下操作:

  • HardwareDiagnostic.h描述了HardwareDiagnostic類。 該文件中沒有using std行,因此包括該文件在內的任何人都不會隱式開始使用不需要的名稱空間。 所有方法都已聲明,但未定義。
  • HardwareDiagnostic.cpp定義HardwareDiagnostic類的方法。 因此,有using std行和所有方法的定義。
  • Localization.h包含HardwareDiagnostic.h,並描述Localization類。 隨着項目的發展,每個類都有單獨的文件變得非常方便。
  • Localization.cpp定義Localization類的方法。
  • Staircase.hStaircase.cpp的構建與本地化相同。
  • main.cpp包括HardwareDiagnostic.hStaircase.h

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM