私有静态成员 - 编译错误?



我正在以下简单的例子来建立我对私有静态成员的理解。但是,我收到编译错误。

这是一个例子,我正在遵循 -

https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.cbclx01/cplr038.htm

更改了C ++版本,以查看它是否与C ++版本有关。

class test1
{
static int i;
static int j;
static int k;
static int f() { return 0;}
int p;
public:
test1()
{
p = 0;
}
};
int main(void)
{
test1 t;
int test1::i = test1::f();
int test1::j = test1::i;
return 0;
}

编译此代码 -

为什么它在这里失败,而示例链接说它可以工作。

$g++ -std=c++14  t1.cpp -o t1.out
t1.cpp: In function ‘int main()’:
t1.cpp:19:16: error: qualified-id in declaration before ‘=’ token
int test1::i = test1::f();
^
t1.cpp:20:16: error: qualified-id in declaration before ‘=’ token
int test1::j = test1::i;

如果我这样做,它会起作用——

class test1
{
static int i;
static int j;
static int k;
static int f() { return 0;}
int p;
public:
test1()
{
p = 0;
}
};
int test1::i = test1::f();
int test1::j = test1::i;
int main(void)
{
test1 t;
return 0;
}

为什么必须在 main() 之外定义它? 它也适用于私人。但是,它不能在主函数中定义。我的理解是,类中的静态 int 只是一个声明。它需要在某处定义。我在main()中定义它,但它不起作用。它需要全球化,我不知道为什么它需要全球化?在我看来,这与私人/公共无关。请在这里澄清我的疑问。

为什么必须在 main() 之外定义它?它也适用于私人。但是,它不能在主函数中定义。我的理解是,类中的静态 int 只是一个声明。它需要在某处定义。我在main()中定义它,但它不起作用。它需要全球化,我不知道为什么它需要全球化?在我看来,这与私人/公共无关。请在这里澄清我的疑问。

是的,类定义中的static int k;确实只是静态数据成员的声明,而不是定义。是的,您需要在某处提供静态数据成员的定义。某处不能在主函数或任何函数内。是的,这与私人与公共无关。这只是可以定义静态数据成员的位置。静态数据成员的定义(未内联定义)必须驻留在包含类定义的命名空间作用域中。因为C++语言的规则是这样说的(特别是在[class.static.data]/2中)。全局命名空间就是这样一种可以定义静态数据成员的地方......

相关内容

最新更新