C++ 无法在C+;类中解析具有枚举返回类型的函数+; 我的check.h文件有一个枚举作为私有变量。我不知道如何将enum声明为全局实体

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() { ...

我在check.cpp中声明了一个枚举返回类型的函数。但它给出的错误如下

  • 这条线上有多个标记
  • 无法解析类型“TStatus”
  • “TStatus”未命名类型
  • 找不到成员声明
我的程序如下。谁能给我一个解决办法吗

检查.cpp

#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之外使用函数的返回类型