Errores, fallos, preguntas - página 1087

 

La notación abreviada del operador postfijo++ no compila cuando se realiza una conversión explícita de un puntero de la clase base a una derivada

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)++;               //ошибка
}
 
Al menos el compilador debería advertir que a.f() no es 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:
Al menos el compilador debería advertir que a.f() no es const
Gracias por su diligencia, ambos errores han sido corregidos.
 
mql5:
Gracias por el aviso, ambos errores han sido corregidos.
Sólo el último no es técnicamente un error - sólo debería ser una advertencia. Sólo es un error si
class B {
public:
        A * const a;
};

Pero en las plantillas. Te daré ejemplos más adelante.

 

Aquí tampoco está claro.

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 );
}

todo funciona correctamente, pero si se añade la función intermedia 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 );
}

El resultado es diferente. ¿Qué ha hecho ex2(...)? - acaba de pasar los punteros por referencia en

Por favor, eche un vistazo a

 
A100:

Aquí tampoco está claro.

todo funciona correctamente, pero si se añade la función intermedia ex2(...)

El resultado es diferente. ¿Qué ha hecho ex2(...)? - acaba de pasar los punteros por referencia en

Por favor, eche un vistazo a

Gracias, error del optimizador de lenguaje, arreglado.
 

No es la primera vez, pero es la única vez que se obtienen esas fotos al subirlas, lo que significa que hay que establecer algunos criterios (probablemente tenga un tamaño determinado).
). En todos los demás lugares se muestran con normalidad. Por favor, dime qué pasa.


 
Se produce un error de compilación innecesario si la macro utiliza una conversión de tipo de resultado y luego no se utiliza el valor de retorno (a veces es necesario, a veces no)
int g( int x ) { return ( x ); }

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

void OnStart()
{
        int f = F( 0 ); //нормально
        F( 0 );         //ошибка компиляции
}
 
A100:
Se produce un error de compilación innecesario si una macro utiliza una conversión de tipo de resultado, y el valor de retorno no se utiliza posteriormente (a veces es necesario, a veces no)

Esto no tiene nada que ver con el uso de definiciones.

Una simple definición equivalente también dará el mismo error

(long)g(0);


'(long)' - expression has no effect


P.D. Ahora habrá un vorning aquí.

 

Después de recompilar el indicador, el error "array out of range" comenzó a ocurrir cuando se trabaja con arrays dinámicos.

Antes no ocurría. ¿Qué hacer?

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
Razón de la queja: