简体   繁体   English

在C ++中,unique_ptr出现错误之前的预期类型说明符

[英]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()); 在下面的代码中,当我编译时出错:Error: main.cpp:8:57:error:'Staircase'std :: unique_ptr algodiagnostic(new Staircase())之前的预期类型说明符;

compilation command g++ HardwareDiagnostic.cpp HardwareDiagnostic.h main.cpp -std=c++0x -o res 编译命令 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. 如果在不单独创建头文件和main.cpp的情况下在单个文件中编译整个代码,则效果很好。 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. 当编译器在main.cpp上运行时,它会看到Staricase的用法,但看不到Staircase类的声明,因此会引发错误。 Your main.cpp file includes header, which describes HardwareDiagnostic class only, but no info for Staircase is provided. 您的main.cpp文件包含标头,该标头仅描述了HardwareDiagnostic类,但未提供有关Staircase的信息。

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. 好的做法是将类声明保留在头文件中,而不是cpp文件中,因此任何其他源都可以包括头文件并开始使用所描述的类。 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. 还可以在头文件中包含一些琐碎的类方法的定义(例如getters / setters),但是复杂的方法应该在头文件中声明并在coresponding cpp文件中定义。

In your case I would do the following: 在您的情况下,我将执行以下操作:

  • HardwareDiagnostic.h describes HardwareDiagnostic class. HardwareDiagnostic.h描述了HardwareDiagnostic类。 There is no using std line in this file, so anyone including this file won't implicitly start using undesired namespace. 该文件中没有using std行,因此包括该文件在内的任何人都不会隐式开始使用不需要的名称空间。 All methods are declared, but not defined. 所有方法都已声明,但未定义。
  • HardwareDiagnostic.cpp defines methods of HardwareDiagnostic class. HardwareDiagnostic.cpp定义HardwareDiagnostic类的方法。 So there is using std line and definition of all methods. 因此,有using std行和所有方法的定义。
  • Localization.h includes HardwareDiagnostic.h and describes Localization class. Localization.h包含HardwareDiagnostic.h,并描述Localization类。 Having separate file for each class becomes very convenient as project grows. 随着项目的发展,每个类都有单独的文件变得非常方便。
  • Localization.cpp defines methods of Localization class. Localization.cpp定义Localization类的方法。
  • Staircase.h and Staircase.cpp are built the same way as localization. Staircase.hStaircase.cpp的构建与本地化相同。
  • main.cpp includes HardwareDiagnostic.h and Staircase.h main.cpp包括HardwareDiagnostic.hStaircase.h

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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