Erreurs, bugs, questions - page 2869

 
Roman:

Comme ça, il n'y a pas d'erreur de syntaxe.

Est-ce que cela compte comme une erreur de syntaxe ?

Alors que le principe de la conversion de type est censé fonctionner ici, et que l'aide permet les deux.

template<typename T>

typename n'est pas un type, c'est un mot-clé. Dans ce cas, le type est T. La conversion se fait vers un type, pas vers le mot-clé.

La justification philosophique n'est pas appropriée ici. Bien que si MQL était un langage abstrait, nous pourrions probablement recourir à la coulée du mot-clé et il passerait immédiatement à la première place du classement.

 
A100:

typename n'est pas un type, c'est un mot-clé. Dans ce cas, le type est T. La conversion se fait vers un type, pas vers un mot clé.

Une justification philosophique n'est pas appropriée ici. Cependant, si MQL était un langage abstrait, nous pourrions probablement le transformer en mot-clé, et il passerait à la première place du classement.

Je comprends que typename n'est pas un type.
Mais dans ce cas, nous avons une transformation.
On obtient son type à partir d'une constante.
Peut-être lasyntaxe n'est-elle pas correcte ? Mais ça marche.

#define  A '+'

typename(A)
 
Roman:

Je comprends que typename n'est pas un type.
Mais dans ce cas, nous obtenons une transformation.
D'une constante, on obtient son type.
Peut-être quece n'est pas la bonne syntaxe ? Mais ça marche.

Ça marche, mais pas de la façon dont vous le pensez. Vous n'obtenez pas un type mais une chaîne de caractères. Je voulais vous le montrer par l'exemple, mais j'ai obtenu une erreur ci-dessous.

Mais cela ne signifie pas que vous avez raison - juste une autre erreur du compilateur.

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

Quelle est la différence entre (1) et (2) ? Chers développeurs - peut-être que Roman a raison et que maintenant typename renvoie le type ?

Le résultat était attendu : chaîne de caractères

 
A100:

Cela fonctionne, mais pas de la manière que vous imaginez. Vous n'obtenez pas un type, mais une chaîne de caractères. Je voulais le montrer avec un exemple, mais j'ai eu une erreur :

Comment ça, ce n'est pas un type ?
Il s'agit d'un type, pas d'une chaîne de caractères.
ushort n'est pas une chaîne de caractères.

#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:

En quoi ce n'est pas un type ?
Je récupère juste un type, pas une chaîne.
Ushort n'est pas une chaîne de caractères.

Vous n'obtenez pas "ushort", mais "ushort". Comprenez-vous la différence ? Si non, lisez la documentation avant de comprendre.

Bien que ce serait cool d'avoir un vrai ushort !

 
A100:

Vous n'obtenez pas "ushort", mais "ushort". Si vous ne comprenez pas la différence, lisez la documentation pour comprendre...

Donc Print() l'imprime déjà comme "ushort" avec une chaîne littérale.
Qu'est-ce que ça a à voir avec ça ? Le fait même que typename renvoie un nom de type !

 
Roman:

Donc cela imprime déjà Print() en tant que chaîne littérale "ushort".
Qu'est-ce que ça a à voir avec ça ? Le fait même que typename renvoie un nom de type !

Avez-vous lu la documentation disponible sur le lien ? Il y a un exemple là aussi. Malheureusement, mon exemple a échoué.

 
A100:

Avez-vous lu la documentation sur le lien ?

Qu'est-ce que cela a à voir avec les modèles ?
Si la syntaxe d'utilisation n'est pas celle d'un modèle, dans ce cas.

 
Roman:

Qu'est-ce que cela a à voir avec les modèles ?
Si la syntaxe d'utilisation n'est pas celle d'un modèle, dans ce cas.

Les développeurs ont mis la description du typename avec un exemple dans cette section. Lisez jusqu'au bout et vous trouverez ce paragraphe et cet exemple

Raison: