【问题标题】:Function with enum return type can not be resolved in a class of C++具有枚举返回类型的函数无法在 C++ 类中解析
【发布时间】:2015-06-19 12:34:18
【问题描述】:
  1. 我的 check.h 文件有一个枚举作为私有变量。我不知道该怎么做才能将枚举声明为全局实体。
  2. 我在 check.cpp 中声明了一个具有枚举返回类型的函数。但它给出的错误如下。

    • 此行有多个标记
    • 无法解析类型“TStatus”
    • “TStatus”没有命名类型
    • 未找到成员声明

我的程序如下。谁能给我一个解决方案。

check.cpp

#include <iostream>
#include "check.h"
using namespace std;


    check::check() { }

    TStatus check::getStatus()
    {
    ......
    }

    check::~check() { }

check.h

#ifndef CHECK_H_
#define CHECK_H_

class check {
private:
    enum TStatus {  ok,sold,defect  };

public:

    check();
    ~check();
    TStatus getStatus();

};

#endif /* CHECK_H_ */

【问题讨论】:

  • 不需要让它成为全局的,但它必须是公共的,否则除了类本身之外其他任何东西都不知道
  • 我不想声明它是全局的。并且 TStatus check::getStatus() 是该类的函数。那么为什么它无法访问枚举。
  • ...再次:如果它是私有的,除了类本身之外的任何代码都是未知的(即,您只能在类内部使用枚举)。如果您想将其用作返回类型,则必须将其公开!将其公开并不会使其成为全球实体。上课还是很紧张。无论如何,我不明白为什么您在全局范围内定义它时遇到问题,它只是一种类型......

标签: c++ class enums


【解决方案1】:

首先,你只需要写

check::TStatus check::getStatus()
^^^^^^^

因为否则编译器不知道TStatus 来自哪里。

在此处查看完整的可编译代码:http://ideone.com/l5qxbK

但还要注意另一个问题。您的 getStatus() 是一个 public 函数,因此您可能希望从类外部调用它。但是你不能这样做,因为返回类型是private,因此不能在类之外使用(下面的条形注释)。因此,您要么需要将枚举设为 public,要么将 getStatus() 设为私有(如果不在课堂外使用)。


注意:您实际上可以在课堂之外使用getStatus(),即使您的TStatus 是私有的——如果您不使用getStatus() 结果;请参阅上面链接的我的 ideone 代码。虽然在明智的设计中这样的调用应该没有多大意义。

另外,请参阅 Vlad 的回答,了解如何使用 auto 实际存储 getStatus() 结果,即使 TStatus 是私有的。虽然更好的是公开TStatus

【讨论】:

  • 好吧,你的例子可以编译。但是只要尝试在类之外使用函数的返回类型,你就会发现这是不可能的。
  • @tobi303,是的,我意识到了这一点并编辑了答案。尽管 OP 确实没有提及在课堂之外使用它。
  • @tobi303,顺便说一句,即使使用私有TResult,也可以从类外部调用该函数...如果未使用其结果:)。虽然这确实是一个奇怪的设计。
【解决方案2】:

你必须在名字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;
}    

程序输出是

2

【讨论】:

  • 哇,奇怪的是,尽管TStatus 是私有的,但它仍然有效,因为auto 这里变成了int
  • @Petr 实际上代码并没有明确使用私有名称。:)
  • 嗯,最初我认为它只是默默地转换为int,但不,auto 似乎允许隐藏类型隐私。
  • 为什么不使用尾随返回类型来避免输入两次“check::”?
  • @VladfromMoscow 这就是你的意见。我发现冗余不太可读。我认为您应该为未来的读者提供两种解决方案
【解决方案3】:

你必须改变你的函数定义如下:

check::TStatus check::getStatus()
    {
        return sold;
    }

演示:http://coliru.stacked-crooked.com/a/0ca5333f3674d39b

【讨论】:

  • 对不起,你错了。在您的示例中,仅产生错误是因为 TStatus::ok 是访问它的错误方式。它应该是check::ok
  • .. 与之前其他答案中的问题相同...尝试在类之外使用此函数的返回值,您将看到它无法编译(因为该类型只知道类)
  • @tobi303 你错了,请查看demo,编辑一下
  • hm 我没有使用 C++11,因此我不熟悉 auto。它实际上是什么类型会很有趣(我怀疑它是类中定义的枚举)。不管怎样,你不同意如果一个类返回某种类型,那么调用者应该可以访问这个类型吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多