Этот код не компилируется в лязг
#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.
Очень бы оценил цитаты из Стандарта.
В исходном коде с закомментированным базовым классом вы пытаетесь использовать имя я это еще не было определено
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];
я является статическим членом данных класса B, то есть массив определяется как
int a[1000];
После этого вы определили член статических данных i класса X, который скрывает член статических данных базового класса B класса Y внутри класса X.
Других решений пока нет …