Я не понимаю этот результат

Этот код не компилируется в лязг

#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.

Очень бы оценил цитаты из Стандарта.

-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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]