c ++,错误:使用qualified-name无效

时间:2013-08-01 17:29:39

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

#include<iostream>
using namespace std;

class sample {
    public:
        static int x;
};

//int sample::x = 20;

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

当我编译此程序时出现错误无效使用限定名称'sample :: x'

我知道我收到此错误是因为在main中声明了 int sample :: x = 30;

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

4 个答案:

答案 0 :(得分:6)

正如标准所说:

  

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

此外,静态数据成员的定义属于类的范围。 所以,

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)

答案 1 :(得分:3)

您必须在全局命名空间中为其分配空间

#include<iostream>

class sample {
    public:
        static int x;
};

int sample::x = 20;

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

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

需要初始化静态变量的原因是全局范围,因为静态变量和全局变量都具有静态存储持续时间

答案 2 :(得分:1)

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

访问

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

所以你无法在main初始化,这是一个语法错误。

答案 3 :(得分:1)

您无法在函数中定义静态变量,但必须在任何范围之外执行此操作: 尝试

int sample::x = 30;

int main() {
    sample s1;
}

代替。 你可以这样做:

int sample::x = 30;

int main() {
    sample s1;

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