我作以下声明:

class Servo {

protected:

    static const int maxServos = 16;
    static Servo servos[maxServos]; //Array declaration
};

Servo Servo::servos[Servo::maxServos]; //Array definition

...它可以编译,很棒!但是我不明白为什么要编译它,因为在我看来maxServos protected 了,并且在定义数组时在全局范围内使用它。我尝试在另一个全局上下文中使用它,的确确实得到了编译错误:
int main() {
    std::cout << Servo::maxServos;  //This will not compile.
}

那么发生了什么 ?数组的整个定义是否受命名空间限定的范围的某种影响?是编译器故障吗?

我正在使用Lubuntu 16.04 O/S在Raspberry PI上使用g++ -std::c++ 11。

最佳答案

这个定义

Servo Servo::servos[Servo::maxServos]; //Array definition

不是全局作用域,由于(第一个)Servo::作用域限定符,它是类作用域。您可以通过删除多余的第二个作用域限定符使这一点更加清楚:
Servo Servo::servos[maxServos]; //Array definition

而且仍然可以编译。

TL; DR-声明程序上的作用域限定符将所有内容放在该作用域的同一声明符中。

关于c++ - 为什么此静态const int成员变量在数组定义中似乎可以公开访问?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55577739/

10-10 11:10