Errores, fallos, preguntas - página 2271
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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.
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?
¿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
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& )
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)
Y si la clase es global, ¿qué línea produce C++?
void f<::A>( ::A& )
void f<A>( A& )
La segunda variante
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.
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.
sustituir por
Si se declara dentro de una función, tampoco se producen errores... ¿cuál es la diferencia fundamental?
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?
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?
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í.