Errores, fallos, preguntas - página 2272

 
fxsaber:

Sólo se crea uno. Además, en f no podrás utilizar T.

Esto en sí mismo es un error.
template<typename T>
void f() { Print( sizeof( T )); }
struct A { int a; };
void OnStart()
{
        f<int>(); //(1)//нормально
        f<A>();   //(2)//нормально
struct B { int b; };
        f<B>();   //(3)//Error: 'B' - undeclared identifier
}
¿Y cuál es la diferencia fundamental entre (1)(2) y (3)?
 
fxsaber:

Además, en f no podrás utilizar T. En definitiva, la situación es evidente para mí.

Además, violó su prohibición de utilizar T en f

template<typename T>
void f() { class T; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

Como puedes ver compila sin errores, y el hecho de que el resultado sea absurdo no es importante mientras todo sea "explicable".

 
Hola a todos. Ayuda. No puedo hacer operaciones de oro, todo funciona, pero son las operaciones las que no puedo hacer. Aquí hay capturas de pantalla de su aspecto.
Archivos adjuntos:
 

¿Cuál es el sentido sagrado de este código, por qué lo han metido en la biblioteca estándar?

   if(IsStopped(__FUNCTION__))
      return(false);

Ahora es imposible utilizar funciones de cierre de posiciones u órdenes de la biblioteca estándar en OnDeanite, por ejemplo con REASON_REMOVE

 
Stanislav Dray:

¿Cuál es el sentido sagrado de este código, por qué lo han metido en la biblioteca estándar?

Ahora no se pueden utilizar funciones para cerrar posiciones u órdenes de la biblioteca estándar en OnDynit, por ejemplo con REASON_REMOVE.

Sí, es un error.

 
A100:

Además, he violado su prohibición de utilizar T en f

Como ves, compila sin errores, y el hecho de que el resultado sea absurdo no es importante - lo principal es que todo sea "explicable".

No entiendes bien lo que son las plantillas. Son similares a las macros sólo que con ciertas características.

Este es el código

template<typename T>
void f() { class T{ MqlTick a; }; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

.

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

Eso es porque T es una configuración, como las macros, sólo que con ciertas salvedades. Lo que tenemos al final es que se crea una firma. Dentro de la función nadie sabe de A que se sustituye por T en la función. Pero se define esta A dentro, por lo que no se produce ningún otro error de compilación. He insertado MqlTick dentro para mostrar que esta A no tiene nada que ver con otras clases del mismo nombre.

En resumen, las intraclases en MQL5 no son visibles fuera de la función madre. Sólo el nombre del tipo como clase se pasa como T. En este caso el nombre no tiene referencia a la función padre.

Es decir, todo es bastante explicable lógicamente. No es un error, sino una implementación tan limitada.


Quizás en una entrevista de trabajo un programador de C++ diría que esto es imposible.

template<typename T>
void f() { class T{}; }


MQL5 es muy posible.

 
fxsaber:

No entiendes muy bien lo que son los patrones.

fxsaber:

ZS Probablemente un programador de C++ en una entrevista de trabajo te dirá que esto es imposible

Si crees que esto es imposible en C++ significa que no soy yo sino tú quien no entiende lo que son las plantillas y cómo funcionan... tanto más que no se puede distinguir una implementación descuidada de una restringida

 
A100:

Si crees que algo así es imposible en C++, eso significa que no soy yo, sino que no entiendes qué son las plantillas y cómo funcionan... tanto más que no se puede distinguir una implementación descuidada de una acotada

Lee la primera palabra de la frase que comentas. Mi comprensión de las plantillas y macros en MQL5 es tal que me doy cuenta sin intentar compilar que tus ejemplos no compilarán en MQL5. C++ - No sé, eso no lo impide.


Te agradecería que mostraras cómo reacciona C++ ante este código

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bichos, errores, preguntas

fxsaber, 2018.09.03 07:16

ZS Probablemente un programador de C++ en una entrevista de trabajo te dirá que esto es imposible

template<typename T>
void f() { class T{}; }
 
fxsaber:

Te agradecería que me mostraras cómo reacciona C++ ante este código.

La reacción es la misma que en MQL. ¿Por qué debería ser diferente? Una plantilla es una plantilla
 
fxsaber:

No entiendes realmente lo que son las plantillas. Y son similares a las macros, sólo que con algunos trucos.

Sí, este ejemplo no compilará en los pluses

error: la declaración de 'struct f()::T' ensombrece la plantilla param template<typename T>

pero incluso si se compilara, el resultado te sorprendería porque el nombre de la clase sería simplemente "T".

si es diferente en mql, esto es incorrecto
Razón de la queja: