【问题标题】:c++, error: Invalid use of qualified-namec++,错误:无效使用限定名
【发布时间】:2013-08-02 18:28:36
【问题描述】:
#include<iostream>
using namespace std;

class sample {
    public:
        static int x;
};

//int sample::x = 20;

int main() {
    sample s1;
    int sample::x = 30;
}

当我编译这个程序然后得到一个错误Invalid use of qualified-name 'sample::x'

我知道我收到此错误是因为 int sample::x = 30; in main.

但我不明白为什么我不能在 main 中定义 int sample::x = 30;

【问题讨论】:

  • 你为什么要在 main 中初始化一个类的静态属性,而不是在类的 .cpp 中,或者在 .h 的全局范围内的类定义之后?
  • @Manu343726 我只是想澄清我的概念!
  • 没有理由生气,我只是做了一个问题,因为我不明白你在做什么
  • @Manu343726 你倒过来了,全局变量和静态变量被认为具有静态存储持续时间
  • @Manu343726 我已经修改了它

标签: c++ class static-members static-variables


【解决方案1】:

正如标准所说:

静态数据成员的定义应出现在包含该成员的类定义的命名空间范围内。

另外,静态数据成员的定义在类的范围内。 所以,

int x = 100; //global variable

class StaticMemeberScope
{
   static int x; 
   static int y;
 };

int StaticMemeberScope::x =1;

int StaticMemeberScope::y = x + 1; // y =2 (StaticMemeberScope::x, not ::x)

【讨论】:

  • @Manu343726 那么它是如何获得紫外线的
  • @Manu343726 哦,我知道你为什么紫外线,标准报价
  • @aaronman 是的。答案引用了标准,然后是一个简短而有针对性的例子。
  • @Uchia 了解未来的 SO 答案,这是一个很好的降价备忘单:joedicastro.com/pages/markdown.html
【解决方案2】:

你必须在全局命名空间中为它分配空间

#include<iostream>

class sample {
    public:
        static int x;
};

int sample::x = 20;

int main() {
    sample s1;
    sample::x = 30;
}

您可以在 main 或任何其他方法中正常设置它。这是静态关键字上的tutorial。我删除了 using 指令,因为引入整个命名空间是不好的做法,尤其是当您不需要它时。

静态变量需要初始化的原因是全局作用域是因为静态变量和全局变量都有静态存储时长

【讨论】:

  • 您不应该建议任何人使用using namespace std;。我会从复制的样本中删除这部分。
【解决方案3】:

您不能在函数内定义静态变量,但必须在任何范围之外执行此操作: 试试

int sample::x = 30;

int main() {
    sample s1;
}

相反。 你可以这样做:

int sample::x = 30;

int main() {
    sample s1;

    sample::x = 42; // Note the different syntax!
}

【讨论】:

    【解决方案4】:

    静态成员就像全局对象,只能通过sample::x访问

    您必须在定义类的全局范围内初始化它们。

    所以你不能在main中初始化,这是语法错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多