Erreurs, bugs, questions - page 2271

 
Vladimir Pastushak:

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 ?

 
fxsaber:

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

 
A100:

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& )

 
fxsaber:

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).

 
fxsaber:
Et si la classe est globale, quelle ligne le C++ produit-il ?

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

void f<A>( A& )

La deuxième variante

 
A100:

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.

 
Georgiy Merts:

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.

Si dans l'exemple initial
        class  A2 { int i; }; //(3)

remplacer par

        interface  A2 {};      //(5)

Si vous déclarez à l'intérieur d'une fonction, aucune erreur ne se produit non plus... quelle est la différence fondamentale ?

 
fxsaber:

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 ?

template<typename T>
void f() { Print(__FUNCSIG__); }
void g1() { class A { int    x; } a; f<A>(); }
void g2() { class A { double x; } a; f<A>(); }
void OnStart()
{
        g1();
        g2();
}

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 ?

 
A100:

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.

 
fxsaber:

On ne fait que créer. De plus, en f vous ne pourrez pas utiliser T.

Cela constitue en soi une erreur.
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
}
Et quelle est la différence fondamentale entre les points 1, 2 et 3 ?