【问题标题】:Protected enum not seen as type, why?受保护的枚举不被视为类型,为什么?
【发布时间】:2017-03-15 10:14:21
【问题描述】:

我正在编译一些将 emun 定义为受保护的代码,像这样

class MPU9250
{
  protected:
    // Set initial input parameters
    enum A_scale
    {
      AFS_2G = 0,
      AFS_4G,
      AFS_8G,
      AFS_16G
    };
}

我想像这样在我的方法中使用那个枚举,这个方法现在在同一个类中是公共的

void setAccScale(A_scale accScale);

但是在编译时出错说

../../MPU9250.h: In function 'void initMovementDetected()':
../../MPU9250.h:196:7: error: 'MPU9250::A_scale AFS_8G' is protected
       AFS_8G,
       ^
../../nRF52.cpp:49:31: error: within this context
  mpu9250.setAccScale(MPU9250::AFS_8G);

这是为什么?我可以setAccScalepublic 吗?

谢谢

class MPU9250
{
  protected:
    // Set initial input parameters
    enum A_scale
    {
      AFS_2G = 0,
      AFS_4G,
      AFS_8G,
      AFS_16G
    };
 public:
       void setAccScale(A_scale accScale);

}

编辑:我发现部分错误,还有一个名为 Ascale 的变量,我将枚举重命名为 A_scale

【问题讨论】:

  • 我没有收到错误消息?
  • 我愿意,上面那个使用gcc-arm-none-eabi/5_2-2015q4/bin/arm-none-eabi-g++作为编译器
  • 你试过void setAccScale(MPU9250::Ascale) 吗?
  • @m.rogalski 是的,我知道了,../../MPU9250.h: In function 'void initMovementDetected()': ../../MPU9250.h:196:7: error: 'MPU9250::A_scale AFS_8G' is protected AFS_8G, ^ ../../nRF52.cpp:49:31: error: within this context mpu9250.setAccScale(MPU9250::AFS_8G);
  • 我认为您想公开使用此enum Ascale,这就是出现错误的原因。我检查了这个here,一切正常......

标签: c++ arduino protected


【解决方案1】:

根据您的错误判断:

../../MPU9250.h:在函数“void initMovementDetected()”中:
../../MPU9250.h:196:7:错误:“MPU9250::A_scale AFS_8G”受保护 AFS_8G,
^
../../nRF52.cpp:49:31:错误:在此上下文中
mpu9250.setAccScale(MPU9250::AFS_8G);

还有你的数据结构:

class MPU9250
{
protected:
    enum A_scale
    {
      AFS_2G = 0,
      AFS_4G,
      AFS_8G,
      AFS_16G
    };

private:
    void setAccScale(A_Scale);
}

我可以假设您正在尝试从 MPU9250 类外部调用 MPU9250::setAccScale,由于该函数的可访问性,这是不可能的。
另一件事是您正在尝试访问 protected subtype 的 MPU9250 的枚举。

为了解决这个问题,我建议让您的 A_scale 公开可见或重写它以使用 #define:

解决方案 1:

// define this in some header
#ifndef AFS_2G
#    define AFS_2G 0
#endif

#ifndef AFS_4G
#    define AFS_4G 1
#endif
// rest of your values ...

//to use this:
mpu9250.SetAccScale(AFS_2G);

解决方案 2:

//declare this enum as public :
class MPU9250
{
public:
    enum A_scale
    {
        AFS_2G = 0,
        AFS_4G = 1
        // rest of your values
    }
};

// to use this:
mpu9250.SetAccScale(MPU9250::A_scale::AFS_2G);

这两种解决方案都要求您创建一个公共函数 SetAccScale,因为我假设您是从 MPU9250 类型之外设置此比例。

【讨论】:

    【解决方案2】:

    如果您要在该范围之外使用枚举,我认为您需要一个公共课程。此外,您的函数中需要一个参数并且缺少分号。我不确定你为什么要在类中声明一个函数?但这是您的代码,其中包含这些更正。希望我能帮到你。

    #include "stdafx.h"
    #include <iostream>
    
    class MPU9250
    {
    public:
        // Set initial input parameters
        enum Ascale
        {
            AFS_2G = 0,
            AFS_4G,
            AFS_8G,
            AFS_16G
        };
        void setAccScale(Ascale accScale) {
            std::cout << accScale << std::endl;
        } // function needs argument
    
    };// missing semi-colon
    int main() {
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      是的,如果您在此类或派生类之外使用 MPU9250::A_scale,请将 A_scale 设为公开。

      但是由于void setAccScale(A_scale accScale)已经是私有的,所以没有需要公开使用A_scale的场景。您能否准确显示它的调用位置,更多上下文:

      ../../nRF52.cpp:49:31: error: within this context
        mpu9250.setAccScale(MPU9250::AFS_8G);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-26
        • 1970-01-01
        • 2013-08-22
        • 2020-02-05
        • 1970-01-01
        • 2011-04-21
        相关资源
        最近更新 更多