[英]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
类。 该文件中没有using std
行,因此包括该文件在内的任何人都不会隐式开始使用不需要的名称空间。 所有方法都已声明,但未定义。 HardwareDiagnostic
类的方法。 因此,有using std
行和所有方法的定义。 Localization
类。 随着项目的发展,每个类都有单独的文件变得非常方便。 Localization
类的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.