简体   繁体   中英

expected type-specifier before error with unique_ptr in c++

In below code while compiling i am getting error , Error : main.cpp:8:57: error: expected type-specifier before 'Staircase' std::unique_ptr algodiagnostic (new Staircase());

compilation command g++ HardwareDiagnostic.cpp HardwareDiagnostic.h main.cpp -std=c++0x -o res

it works fine if compile entire code in single file without creating header file and main.cpp separately. Can anybody suggest how to fix this issue.

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

When compiler works on main.cpp, it sees Staricase usage, but doesn't see declaration for Staircase class, so error is raised. Your main.cpp file includes header, which describes HardwareDiagnostic class only, but no info for Staircase is provided.

Good practice is to keep class declarations in header files, rather than cpp files, so any other source can include header file and start using described class. It's OK to include definition for trivial class methods in header file as well (like getters/setters), but complicated methods should be declared in header file and defined in coresponding cpp file.

In your case I would do the following:

  • HardwareDiagnostic.h describes HardwareDiagnostic class. There is no using std line in this file, so anyone including this file won't implicitly start using undesired namespace. All methods are declared, but not defined.
  • HardwareDiagnostic.cpp defines methods of HardwareDiagnostic class. So there is using std line and definition of all methods.
  • Localization.h includes HardwareDiagnostic.h and describes Localization class. Having separate file for each class becomes very convenient as project grows.
  • Localization.cpp defines methods of Localization class.
  • Staircase.h and Staircase.cpp are built the same way as localization.
  • main.cpp includes HardwareDiagnostic.h and Staircase.h

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM