在 C++ 中 unique_ptr 错误之前预期的类型说明符
expected type-specifier before error with unique_ptr in c++
在下面的代码中,编译时出现错误,
错误 :
main.cpp:8:57: 错误:'Staircase' 之前需要类型说明符
std::unique_ptr算法诊断(新楼梯());
编译命令
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 class 的声明,因此会引发错误。您的 main.cpp 文件包含 header,它仅描述 HardwareDiagnostic class,但未提供 Staircase 的信息。
好的做法是将 class 声明保留在 header 文件中,而不是 cpp 文件中,因此任何其他来源都可以包含 header 文件并开始使用描述的 class .也可以在 header 文件中包含普通 class 方法的定义(如 getters/setters),但复杂的方法应在 header 文件中声明并在对应的 cpp 文件中定义.
对于您的情况,我会执行以下操作:
- HardwareDiagnostic.h描述了
HardwareDiagnostic
class。此文件中没有 using std
行,因此包含此文件的任何人都不会隐式开始使用不需要的名称空间。所有方法都已声明,但未定义。
- HardwareDiagnostic.cpp定义了
HardwareDiagnostic
class的方法。所以有 using std
行和所有方法的定义。
- Localization.h 包括 HardwareDiagnostic.h 并描述
Localization
class。随着项目的增长,每个 class 都有单独的文件变得非常方便。
- Localization.cpp定义了
Localization
class. 的方法
- Staircase.h 和 Staircase.cpp 的构建方式与本地化相同。
- main.cpp包括HardwareDiagnostic.h和Staircase.h
在下面的代码中,编译时出现错误, 错误 : main.cpp:8:57: 错误:'Staircase' 之前需要类型说明符 std::unique_ptr算法诊断(新楼梯());
编译命令 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 class 的声明,因此会引发错误。您的 main.cpp 文件包含 header,它仅描述 HardwareDiagnostic class,但未提供 Staircase 的信息。
好的做法是将 class 声明保留在 header 文件中,而不是 cpp 文件中,因此任何其他来源都可以包含 header 文件并开始使用描述的 class .也可以在 header 文件中包含普通 class 方法的定义(如 getters/setters),但复杂的方法应在 header 文件中声明并在对应的 cpp 文件中定义.
对于您的情况,我会执行以下操作:
- HardwareDiagnostic.h描述了
HardwareDiagnostic
class。此文件中没有using std
行,因此包含此文件的任何人都不会隐式开始使用不需要的名称空间。所有方法都已声明,但未定义。 - HardwareDiagnostic.cpp定义了
HardwareDiagnostic
class的方法。所以有using std
行和所有方法的定义。 - Localization.h 包括 HardwareDiagnostic.h 并描述
Localization
class。随着项目的增长,每个 class 都有单独的文件变得非常方便。 - Localization.cpp定义了
Localization
class. 的方法
- Staircase.h 和 Staircase.cpp 的构建方式与本地化相同。
- main.cpp包括HardwareDiagnostic.h和Staircase.h