Erreurs, bugs, questions - page 2271
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
A quoi peut être lié le comportement suivant
l'indicateur de compilation fonctionne correctement, l'indicateur de recompilation ne fonctionne pas correctement. Est-ce que cela fonctionne correctement dans le testeur ?
Quel indicateur ?
Que produit le C++ ici?
Pour que cela fonctionne dans MQL5, vous devez avoir deux chaînes de caractères différentes dans la sortie, et non la même. Mais alors le mécanisme de formation de la signature devrait être absolument différent. Si le C++ donne le même résultat en impression, le coût de __FUNCSIG__ diminuera considérablement.
Résultat : C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Comme vous pouvez le voir, les cordes sont différentes... la signature de la fonction est utilisée
Résultat : C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Comme vous pouvez le voir, les cordes sont différentes... la signature de la fonction est utilisée
Le MQL5 s'éteint.
void f<A>(A&)
C'est-à-dire qu'il n'y a pas de signature de classe dans la fonction. Elle sera soutenue un jour.
Et si la classe est globale, quelle ligne le C++ génère-t-il ?
void f<::A>( ::A& )
void f<A>( A& )
Le MQL5 distribue
C'est-à-dire qu'il n'y a pas de signature de classe dans la fonction. Elle sera soutenue un jour.
Si les compilateurs C++ obsolètes ne le supportent pas, ils donnent déjà une erreur sur la première ligne (1) du code source. C'est pourquoi la question a été posée de cette manière en premier lieu : pourquoi y a-t-il une erreur dans un cas et une erreur normale dans l'autre ?
Nous nous attendions au même comportement dans les deux cas : soit une erreur, soit aucune erreur. Et l'erreur ne réside pas dans l'absence de soutien en soi, mais dans le comportement inégal dans des conditions par ailleurs égales (comme dans cet exemple).
Et si la classe est globale, quelle ligne le C++ produit-il ?
void f<::A>( ::A& )
void f<A>( A& )
La deuxième variante
Si les compilateurs C++ obsolètes ne le supportent pas, ils donnent déjà une erreur sur la première ligne (1) du code source. C'est pourquoi la question a été posée de cette manière en premier lieu : pourquoi y a-t-il une erreur dans un cas et une erreur normale dans un autre ?
Nous nous attendions au même comportement dans les deux cas : soit une erreur, soit aucune erreur. Et l'erreur ne réside pas dans l'absence de soutien en soi, mais dans un comportement inégal, toutes choses égales par ailleurs (comme dans cet exemple).
Eh bien, c'est facile à expliquer. Le compilateur parcourt le code de haut en bas en formant des signatures correspondantes au fur et à mesure. La première signature est créée sans problème. On arrive à la deuxième et il y a déjà une telle signature. Ici, nous avons une erreur sur la deuxième ligne.
Si vous déclarez les classes (3)(4) en dehors des fonctions, aucune erreur ne se produit. Si vous déclarez à l'intérieur d'une fonction, des erreurs se produisent.
remplacer par
Si vous déclarez à l'intérieur d'une fonction, aucune erreur ne se produit non plus... quelle est la différence fondamentale ?
C'est donc compréhensible. Le compilateur va de haut en bas du code, formant les signatures appropriées au fur et à mesure. Il crée la première signature sans aucun problème. Il arrive au deuxième et il en a déjà un. Il y a donc une erreur sur la deuxième ligne.
Alors pourquoi compile-t-il dans MQL sans erreur ?
Résultat : MQL C++
void f<A>() void f<g1 ::A>()
void f<A>() void f<g2 ::A>()
Pourquoi les signatures sont-elles créées ici sans aucune interférence ?
Alors pourquoi compile-t-il dans MQL sans erreur ?
Résultat : MQL C++
void f<A>() void f<g1 ::A>()
void f<A>() void f<g2 ::A>()
Pourquoi les signatures sont-elles créées ici sans aucune interférence ?
On ne fait que créer. De plus, en f, vous ne pouvez pas utiliser T. Quoi qu'il en soit, la situation est évidente pour moi.
On ne fait que créer. De plus, en f vous ne pourrez pas utiliser T.