Ошибки, баги, вопросы - страница 3315

В одном случае есть сообщение об ошибке, а в другом нет:
class A {
    class B {
    public:
        static int i;
    };
    static int i;
};
int A::i;
int A::B::i;
void OnStart()
{
    Print( A::B::i ); //(1) нормально
    Print( A::i );    //(2) Error: cannot access to private member 'i' declared in class 'A'
}

А какая принципиальная разница?

A100 #:
В одном случае есть сообщение об ошибке, а в другом нет:

А какая принципиальная разница?

A::B - private-тип класса? Вроде, он только объявлен в теле A. Но полем сам не является.

fxsaber #:

A::B - private-тип класса? Вроде, он только объявлен в теле A. Но полем сам не является.

Спецификатор доступа действует для всего, что объявлено после него, пока не будет объявлен следующий спецификатор. Ошибка компилятора в том числе и в следующем примере:
Нет сообщения об ошибке доступа:
class A {
    enum E {
	a,
	b
    };
};
void OnStart()
{
    Print(EnumToString((A::E)1)); //нормально ???
}
SymbolInfoDouble(_Symbol,SYMBOL_BID) не всегда равен цене закрытия rates[0].close (структура MqlRates), это ведь баг?
Konstantin Kulikov #:
SymbolInfoDouble(_Symbol,SYMBOL_BID) не всегда равен цене закрытия rates[0].close (структура MqlRates), это ведь баг?
volatile int i;
int f1() { return i; }
int f2() { return i; }
void f()
{                          //Результат:
    Print( f1() == f2() ); //false (что в общем случае допустимо)
{
Ошибка при компиляции:
class A {
public:
    class B {
    public:
        static int i;
    };
};
int A::B::i;
void OnStart()
{
    Print(         A::B::i ); //(1)//нормально
    Print(typename(A::B::i)); //(2)//Error: 'i' - undeclared identifier
}
А какая принципиальная разница между (1) и (2) ?
A100 #:
Ошибка при компиляции: А какая принципиальная разница между (1) и (2) ?
Print(typename((A::B::i)))

Догадался.

fxsaber #:

Догадался.

Да, я помню Ваше отношение к дополнительным скобкам - там правда фигурные были:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2022.11.05 17:39

Ограничение компилятора.
void OnStart()
{
  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
  {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
Ошибка при компиляции:
class A {
    static int i;
};
int A::i = 1; //(1)
int A::i = 2; //(2)//нормально ???
int    i = 3; //(3)
int    i = 4; //(4)//Error: 'i' - variable already defined
А какая принципиальная разница между (2) и (4) ?