此代码不会在clang
中编译#include <iostream>
namespace M {
class B {
public:static const int i = 1000;
};
}
namespace N {
class Y /*: public M::B*/ {
class X {
int a[i];
static const int i = 1;
public:
X() { for(int j = 0; j < i; ++j ) a[j] = 1; }
static int Get() { return i; }
};
public:
int Get() { return X::Get(); }
};
}
int main()
{
N::Y y;
std::cout << y.Get() << '\n';
}
但如果我注释/*: public M::B*/
,则打印1.但是,如果我将语句static const int i = 1;
放在 int a[i];
之前,则会在两个版本的代码,打印1。
非常感谢标准的引用。
答案 0 :(得分:1)
在带有注释基类的原始代码中,您尝试使用尚未定义的名称 i
class X {
int a[i]; // here i is undefined
static const int i = 1;
如果你要交换两个定义
class X {
static const int i = 1;
int a[i];
然后代码将成功编译,因为我在数组定义中使用的是之前定义的..
当基类被取消注释时,则在此定义中
int a[i];
i是B类的静态数据成员,该数组定义为
int a[1000];
之后,您定义了类X的静态数据成员i,它隐藏了类X中类Y的基类B的静态数据成员。