Errores, fallos, preguntas - página 2271

 
A100:
Un error de compilación:

¿Cuál es la diferencia fundamental entre (1)(2) y (3)(4)?

Si se declaran las clases (3)(4) fuera de las funciones, no se produce ningún error. Si se declara dentro de una función, se producen errores.

 
Vladimir Pastushak:

Con qué puede relacionarse el siguiente comportamiento

El indicador de compilación funciona correctamente, el indicador de compilación de nuevo no funciona correctamente. ¿Funciona correctamente en el probador?

¿Qué indicador?

 
fxsaber:

¿Qué produce aquí C++?

Para que funcione en MQL5, necesitas tener dos cadenas diferentes en la salida, no la misma. Pero entonces el mecanismo de formación de la firma debería ser absolutamente diferente. Si C++ produce el mismo resultado en la impresión, el coste de __FUNCSIG__ se reducirá drásticamente.

Resultado: C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

Como puedes ver las cuerdas son diferentes... se utiliza la firma de la función

 
A100:

Resultado: C++

void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )

Como puedes ver las cuerdas son diferentes... se utiliza la firma de la función

El MQL5 se rinde.

void f<A>(A&)

Es decir, no hay firma de clase dentro de la función. Algún día se apoyará.


Y si la clase es global, ¿qué línea genera C++?

void f<::A>( ::A& )

void f<A>( A& )

 
fxsaber:

El MQL5 da

Es decir, no hay firma de clase dentro de la función. Algún día se apoyará.

Si los compiladores de C++ obsoletos no lo soportan, ya dan un error en la primera línea (1) del código fuente. Por eso se planteó la pregunta de esta manera en primer lugar: ¿por qué hay un error en un caso y un error normal en el otro?

Esperábamos el mismo comportamiento en ambos casos: un error o ningún error. Y el error no está en la falta de apoyo per se, sino en el comportamiento desigual en condiciones por lo demás iguales (como en este ejemplo)

 
fxsaber:
Y si la clase es global, ¿qué línea produce C++?

void f<::A>( ::A& )

void f<A>( A& )

La segunda variante

 
A100:

Si los compiladores de C++ obsoletos no lo soportan, ya dan un error en la primera línea (1) del código fuente. Por eso se planteó la pregunta de esta manera en primer lugar: ¿por qué hay un error en un caso y un error normal en otro?

Esperábamos el mismo comportamiento en ambos casos: un error o ningún error. Y el error no está en la falta de apoyo en sí, sino en un comportamiento desigual, a igualdad de condiciones (como en este ejemplo)

Es fácil de explicar. El compilador recorre el código de arriba a abajo formando las firmas correspondientes a medida que avanza. La primera firma se crea sin problemas. Llega a la segunda y ya existe dicha firma. Aquí tenemos un error en la segunda línea.

 
Georgiy Merts:

Si se declaran las clases (3)(4) fuera de las funciones, no se produce ningún error. Si se declara dentro de una función, se producen errores.

Si en el ejemplo inicial
        class  A2 { int i; }; //(3)

sustituir por

        interface  A2 {};      //(5)

Si se declara dentro de una función, tampoco se producen errores... ¿cuál es la diferencia fundamental?

 
fxsaber:

Así que es comprensible. El compilador va de arriba a abajo del código, formando las firmas adecuadas a medida que avanza. Crea la primera firma sin problemas. Llega al segundo y ya tiene uno. Por lo tanto, hay un error en la segunda línea.

Entonces, ¿por qué se compila en MQL sin errores?

template<typename T>
void f() { Print(__FUNCSIG__); }
void g1() { class A { int    x; } a; f<A>(); }
void g2() { class A { double x; } a; f<A>(); }
void OnStart()
{
        g1();
        g2();
}

Resultado: MQL C++

void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()

¿Por qué las firmas se crean aquí sin ninguna interferencia?

 
A100:

Entonces, ¿por qué se compila en MQL sin errores?

Resultado: MQL C++

void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()

¿Por qué las firmas se crean aquí sin ninguna interferencia?

Sólo se crea uno. Además, en f no se puede utilizar T. De todos modos, la situación es obvia para mí.