Errores, fallos, preguntas - página 2869

 
A100:

Tienes un error de sintaxis - da un ejemplo de código que funcione con (typename) entre paréntesis. También podrías escribir (OnStart) entre paréntesis

Bueno, no hay ningún error de sintaxis

typename(J)

Pero, ¿ya considera este código un error de sintaxis?

(typename)J

Cuando un principio de conversión de tipo se supone que funciona aquí, y la ayuda permite ambas variantes.

 
Roman:

Así, no hay error de sintaxis.

¿Cuenta esto como un error de sintaxis?

Cuando se supone que el principio de la conversión de tipos funciona aquí, y la ayuda permite ambas cosas.

template<typename T>

typename no es un tipo, es una palabra clave. En este caso, el tipo es T. La conversión es a un tipo, no a la palabra clave.

La justificación filosófica no es apropiada aquí. Aunque si MQL fuera un lenguaje abstracto, probablemente podríamos recurrir a la fundición a la palabra clave y pasaría al 1er lugar del ranking

 
A100:

typename no es un tipo, es una palabra clave. En este caso, el tipo es T. La conversión es a un tipo, no a una palabra clave

La justificación filosófica no es apropiada en este caso. Aunque, si MQL fuera un lenguaje abstracto, probablemente podríamos lanzarlo a la palabra clave, y pasaría a ocupar el primer lugar en la clasificación

Entiendo que typename no es un tipo.
Pero en este caso, tenemos una transformación.
Obtenemos su tipo a partir de una constante.
¿Quizásla sintaxis no es correcta? Pero funciona.

#define  A '+'

typename(A)
 
Roman:

Entiendo que typename no es un tipo.
Pero en este caso, obtenemos una transformación.
De una constante obtenemos su tipo.
¿Tal vezno sea la sintaxis correcta? Pero funciona.

Funciona, pero no de la manera que crees. No se obtiene un tipo sino una cadena. Quería mostrarte esto con un ejemplo, pero me da un error abajo.

Pero eso no significa que tengas razón, sino que es otro error del compilador.

 
Error de compilación:
void OnStart()
{
    Print(typename("ushort"));      //(1) нормально
    Print(typename(typename('+'))); //(2) Error: 'typename' - unexpected token
}

¿Cuál es la diferencia entre (1) y (2)? Estimados desarrolladores: ¿tal vez Roman tenga razón y ahora typename devuelva el tipo?

El resultado era el esperado: cadena

 
A100:

Funciona, pero no de la manera que imaginas. No se obtiene un tipo, sino una cadena. Quería mostrarlo con un ejemplo, pero me da error:

¿Cómo no es un tipo?
Es un tipo, no una cadena.
ushort no es una cadena.

#define   A '+'

void OnStart()
{
   Print(typename(A));
   Print(typename("string"));
}
2020.10.09 01:45:54.402 TestScript (MNQZ20,M1)  ushort
2020.10.09 01:45:54.402 TestScript (MNQZ20,M1)  string
 
Roman:

¿Cómo es que no es un tipo?
Sólo se obtiene un tipo, no una cadena.
Ushort no es una cadena.

No se obtiene ushort, sino "ushort". ¿Entiendes la diferencia? Si no es así, lee la documentación antes de entenderla.

¡Aunque sería genial conseguir un ushort de verdad!

 
A100:

No se obtiene ushort, sino "ushort". ¿Entiendes la diferencia? Si no es así, lee la documentación para entenderlo

Así que Print() ya lo imprime como "ushort" con un literal de cadena.
¿Qué tiene que ver? ¡El mismo hecho de que typename devuelva un nombre de tipo!

 
Roman:

Así que esto ya imprime Print() como literal de cadena "ushort".
¿Qué tiene eso que ver? ¡El mismo hecho de que typename devuelva un nombre de tipo!

¿Has leído la documentación en el enlace? Ahí también hay un ejemplo. Por desgracia, mi ejemplo ha fallado.

 
A100:

¿Has leído la documentación del enlace?

¿Qué tiene que ver con las plantillas?
Si la sintaxis de uso no es para una plantilla, en este caso.

Razón de la queja: