我已经声明了一个全局数据和全局函数,当我尝试在类编译器中访问时抛出错误为"我不能出现在常数表达中,为什么?
#include<iostream>
using namespace std;
int i=20;
void fn()
{
cout<<" I am outside class"<<endl;
}
class a
{
public:
int x= ::i; // error is i cannot appear in constant expression
void accessGlobal()
{
::fn(); //fn() is being called
}
};
int main()
{
a obj;
obj.accessGlobal();
}
答案 0 :(得分:2)
您的问题与全局变量无关,但与类成员初始化有关。
使用x
尝试的是类内成员初始化,并且自C ++ 11以来在C ++中受支持,标准部分§12.6.2:
在非委托构造函数中,如果给定的非静态数据成员或 基类不是由mem-initializer-id指定的(包括 因为构造函数没有mem-initializer-list的情况 没有ctor-initializer)并且实体不是虚拟基类 抽象类(10.4),然后
- 如果实体是具有大括号或等于初始化程序的非静态数据成员,则实体初始化为 8.5;
解决方案:
示例:
a() : x(::i) {}
答案 1 :(得分:-1)
你需要使用C ++ 11标准来编译这段代码,在以前的标准中禁止在类的定义中定义非静态变量(类的构造函数应该这样做)。遵循旧标准,您还可以尝试在变量声明之前添加static
关键字,并在类定义之后对其进行初始化:
class a {
public:
static int x;
};
int a::x = ::i;