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

 

Сокращенная нотация постфиксного оператора++ не компилируется при явном приведении указателя базового класса к производному

class A {
};

class B : public A {
public:
        void    operator++( int ) {}
        void    operator++()      {}
};

void f( A* a )
{
        ((B *)a).operator++( 0 ); //нормально
        ((B *)a).operator++();    //нормально
        ++((B *)a);               //нормально
        ((B *)a)++;               //ошибка
}
 
По крайней мере предупреждение компилятор должен выдавать, что a.f() не const
class A {
public:
        int f() { return ( 1 ); }
};

class B {
public:
                B( const A *aa ) : a( aa ) {}
        int g() { return ( a.f() ); } //должно быть предупреждение, поскольку a.f() не const
        const A *a;
};
 
A100:
По крайней мере предупреждение компилятор должен выдавать, что a.f() не const
Спасибо за внимательность, поправили обе ошибки.
 
mql5:
Спасибо за внимательность, поправили обе ошибки.
Только последняя - это формально не ошибка - только предупреждение должно быть. Ошибка только если
class B {
public:
        A * const a;
};

А вот в шаблонах.  Примеры приведу позже

 

   Здесь тоже - не понятно

class A {
public:
};

void ex1( const A* &t1, const A* &t2 )
{
        const A* t = t1;
        t1 = t2;
        t2 = t;
}

void OnStart()
{
    const A *a1 = new A(), *a2 = new A();
    Print( "Было :" a1, " ", a2 ); // Было :1 2
    ex1( a1, a2 );
    Print( "Стало:" a1, " ", a2 ); // Стало:2 1
    delete( a1 );
    delete( a2 );
}

все работает правильно, а если добавить промежуточную функцию ex2(...) 

void ex2( const A* &t1, const A* &t2 ) { ex1( t1, t2 ); }

void OnStart()
{
    сonst A *a1 = new A(), *a2 = new A();
    Print( "Было: ", a1, " ", a2 ); // Было :1 2
    ex2( a1, a2 );
    Print( "Стало:", a1, " ", a2 ); // Cтало:2 2           <-----
    delete( a1 ); delete( a2 );
}

Результат отличается. А что сделала ex2(...) ? - просто передала указатели по ссылке дальше

Посмотрите пожалуйста

 
A100:

   Здесь тоже - не понятно

все работает правильно, а если добавить промежуточную функцию ex2(...) 

Результат отличается. А что сделала ex2(...) ? - просто передала указатели по ссылке дальше

Посмотрите пожалуйста

Спасибо, ошибка оптимизатора языка, исправлено.
 

Не первый раз уже, но только тут фотографии при загрузке получаются такие, значит какие то стоят критерии(наверное у вас стоит определенный размер
). Везде нормально отображаются. Подскажите пожалуйста в чем дело.


 
Возникает ненужная ошибка компиляции, если в макросе используется приведение типа результата, и возвращаемое значение в дальнейшем - не используется (иногда оно нужно, иногда - нет)
int g( int x ) { return ( x ); }

#define F( X )    (long)g( X )

void OnStart()
{
        int f = F( 0 ); //нормально
        F( 0 );         //ошибка компиляции
}
 
A100:
Возникает ненужная ошибка компиляции, если в макросе используется приведение типа результата, и возвращаемое значение в дальнейшем - не используется (иногда оно нужно, иногда - нет)

Это не связано с использованием дефайнов.

Простой эквивалент дефайна тоже выдаст ту же ошибку

(long)g(0);


'(long)' - expression has no effect


P.S. Теперь тут будет ворнинг.

 

После перекомпиляции индикатора при работе с динамическими массивами стала возникать ошибка "array out of range".

Раньше не было. Что делать? 

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
Причина обращения: