C++ 无法在C+;类中解析具有枚举返回类型的函数+; 我的check.h文件有一个枚举作为私有变量。我不知道如何将enum声明为全局实体
我在check.cpp中声明了一个枚举返回类型的函数。但它给出的错误如下C++ 无法在C+;类中解析具有枚举返回类型的函数+; 我的check.h文件有一个枚举作为私有变量。我不知道如何将enum声明为全局实体,c++,class,enums,C++,Class,Enums,我在check.cpp中声明了一个枚举返回类型的函数。但它给出的错误如下 这条线上有多个标记 无法解析类型“TStatus” “TStatus”未命名类型 找不到成员声明 我的程序如下。谁能给我一个解决办法吗 检查.cpp #include <iostream> #include "check.h" using namespace std; check::check() { } TStatus check::getStatus() { ...
- 这条线上有多个标记
- 无法解析类型“TStatus”
- “TStatus”未命名类型
- 找不到成员声明
#include <iostream>
#include "check.h"
using namespace std;
check::check() { }
TStatus check::getStatus()
{
......
}
check::~check() { }
首先,你只需要写
check::TStatus check::getStatus()
^^^^^^^
因为否则编译器不知道TStatus
从哪里来
请参见此处的完整可编译代码:
但请注意另一个问题。您的getStatus()
是一个public
函数,因此您可能希望从类外部调用它。但您将无法执行此操作,因为返回类型为private
,因此不能在类外使用(下面的条形注释)。因此,您要么需要将枚举设置为公共的
,要么可以将getStatus()
设置为私有的(如果未在类之外使用)
注意:如果您不使用
getStatus()
结果,您实际上可以在您的类之外使用getStatus()
,即使您的TStatus
是私有的;请参阅上面链接的我的表意文字代码。虽然在合理的设计中,这样的呼吁应该没有多大意义
另外,请参见Vlad关于如何使用
auto
实际存储getStatus()
结果的回答,即使TStatus
是私有的。尽管更好的方法是将TStatus
公开。首先,您只需要编写
check::TStatus check::getStatus()
^^^^^^^
因为否则编译器不知道TStatus
从哪里来
请参见此处的完整可编译代码:
但请注意另一个问题。您的getStatus()
是一个public
函数,因此您可能希望从类外部调用它。但您将无法执行此操作,因为返回类型为private
,因此不能在类外使用(下面的条形注释)。因此,您要么需要将枚举设置为公共的
,要么可以将getStatus()
设置为私有的(如果未在类之外使用)
注意:如果您不使用
getStatus()
结果,您实际上可以在您的类之外使用getStatus()
,即使您的TStatus
是私有的;请参阅上面链接的我的表意文字代码。虽然在合理的设计中,这样的呼吁应该没有多大意义
另外,请参见Vlad关于如何使用
auto
实际存储getStatus()
结果的回答,即使TStatus
是私有的。尽管更好的方法是将TStatus
公开。您必须更改函数定义,如下所示:
check::TStatus check::getStatus()
{
return sold;
}
演示:您必须更改函数定义,如下所示:
check::TStatus check::getStatus()
{
return sold;
}
演示:您必须在名称之前指定类名
TStatus
check::TStatus check::getStatus()
//...
这是一个演示程序
#include <iostream>
class check {
private:
enum TStatus { ok, sold, defect };
public:
check() = default;
~check() = default;
TStatus getStatus() const;
};
check::TStatus check::getStatus() const { return defect; }
int main()
{
auto status = check().getStatus();
std::cout << status << std::endl;
}
您必须在name
TStatus
check::TStatus check::getStatus()
//...
这是一个演示程序
#include <iostream>
class check {
private:
enum TStatus { ok, sold, defect };
public:
check() = default;
~check() = default;
TStatus getStatus() const;
};
check::TStatus check::getStatus() const { return defect; }
int main()
{
auto status = check().getStatus();
std::cout << status << std::endl;
}
不需要使它成为全局的,但它必须是公共的,否则它除了类本身之外对任何东西都是未知的。我不想将它声明为全局的。TStatus check::getStatus()是该类的一个函数。那么为什么它不能访问enum呢?再说一遍:如果它是私有的,那么除了类本身之外,任何代码都不知道它(也就是说,您只能在类内部使用enum)。如果你想使用它作为返回类型,你必须公开它!公开并不意味着它是一个全球性的实体。它仍然紧挨着班级。无论如何,我不明白为什么在定义一个全局作用域时会遇到问题,它只是一个类型……不需要将它设置为全局的,但它必须是公共的,否则它除了类本身之外什么都不知道。我不想将它声明为全局的。TStatus check::getStatus()是该类的一个函数。那么为什么它不能访问enum呢?再说一遍:如果它是私有的,那么除了类本身之外,任何代码都不知道它(也就是说,您只能在类内部使用enum)。如果你想使用它作为返回类型,你必须公开它!公开并不意味着它是一个全球性的实体。它仍然紧挨着班级。不管怎么说,我不明白为什么在全局范围内定义它时会有问题,它只是一种类型……对不起,你错了。在您的示例中,产生此错误的唯一原因是
TStatus::ok
是错误的访问方式。它应该是check::ok
。。与之前的其他答案相同的问题。。。尝试在类之外使用此函数的返回值,您将看到它无法编译(因为类型仅为类所知)@tobi303如果您错了,请检查演示,编辑为:我不使用C++11,因此我不熟悉auto
。它实际上是什么类型会很有趣(我怀疑它是类中定义的枚举)。无论如何,你不同意如果一个类返回某个类型,调用者应该可以访问这个类型吗?对不起,你错了。在您的示例中,产生此错误的唯一原因是TStatus::ok
是错误的访问方式。它应该是check::ok
。。与之前的其他答案相同的问题。。。尝试在类之外使用此函数的返回值,您将看到它无法编译(因为类型仅为类所知)@tobi303如果您错了,请检查演示,编辑为:我不使用C++11,因此我不熟悉auto
。它实际上是什么类型会很有趣(我怀疑它是类中定义的枚举)。无论如何,你不同意如果一个类返回某个类型,调用方应该可以访问这个类型吗?好的,你的例子是编译的。但只需尝试在clas之外使用函数的返回类型