Erreurs, bugs, questions - page 1980

 
Andrey Barinov:
Pour votre référence, si vos deux exemples sont clairement traduits en C++, alors le C++ donnera une erreur dans les deux cas. MQL ne donne pas d'erreur dans le 1er cas uniquement parce que le processus de compilation (et non le langage lui-même) est différent.
 
A100:
En demandant la compilation en C++ ?

Avec ces deux passages :

Avez-vous essayé de compiler cet exemple en C++ - ou s'agit-il d'un raisonnement théorique général ?

en réponse à l'exemple de travail en C++ que j'ai donné, ainsi que

Si vous ne l'avez pas essayé, écrivez-le de cette façon.

En réponse à mon exemple, je viens de l'essayer.

 
Stanislav Korotky:

Avec ces deux passages :

en réponse à l'exemple de travail que j'ai donné en C++, et aussi

en réponse à ce que je viens d'essayer.

Lorsque vous écrivez ServiceDesk, citez-vous également le code d'un site tiers à titre d'exemple ? Et si non, pourquoi pas ?
 
A100:
Pour votre référence, si vos deux exemples sont clairement traduits en C++, alors le C++ donnera une erreur dans les deux cas. MQL ne donne pas d'erreur dans le 1er cas uniquement parce que le processus de compilation (et non le langage lui-même) est différent.

Merci.

 
Andrey Barinov:

Merci.

Pour ne pas être sans fondement, je donne l'analogue du dernier (en le modifiant un peu à ma façon) :

#ifdef __cplusplus
class B;
class A {
        int f( B* b ) { return b->i; } //Error: E2315
        int i;
};
class B : public A {};
#endif

et au message original

#ifdef __cplusplus
class B;
class A {
        void f() {}
        void g() { b->f(); } //Error: E2315
        B *b;
};
class B : public A {};
#endif
 

J'ai vérifié, la variante de Stanislav compile avec succès dans VS 2010. En outre, l'accès au champ privé fonctionne également, et pas seulement à la méthode. Alors, peut-être que A100 était un peu trop dans ses conclusions cette fois-ci).

 
Alexey Navoykov:

J'ai vérifié, la variante de Stanislav compile avec succès dans VS 2010. En outre, l'accès au champ privé fonctionne également, et pas seulement à la méthode. Donc, peut-être que A100 s'est trompé dans ses conclusions cette fois-ci).

Est-ce exactement la même chose que https://www.mql5.com/ru/forum/1111/page1999#comment_5677254?

Voici mes options... poster le code ici - s'il ne peut pas le faire lui-même

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.08.29
  • www.mql5.com
Форум алго-трейдеров MQL5
 
A100:

Correspond-il exactement à https://www.mql5.com/ru/forum/1111/page1999#comment_5677254?

Ci-dessus sont mes variantes. poster le code ici - puisqu'il ne peut pas le faire lui-même

Quel compilateur avez-vous utilisé pour le compiler ? Mon VS 2010 ne compile pas votre code pour une toute autre raison : la classe B n'est pas définie à l'endroit où la méthode de cette classe est appelée. Vous devez mettre la définition de g() en dehors de la classe pour cela. Et c'est exactement ce que Stanislav a fait. C'est-à-dire que votre code devrait être comme ceci :

class B;
class A {
  void f() {}
  void g();
  B *b;
};
class B : public A {};


void A::g(void)
{
  b->f();
}

et il compile.

 
Alexey Navoykov:

Quel compilateur avez-vous utilisé pour le faire ?

En fait, cela ne change rien - erreur de compilation (j'ai une tablette - compilateur Borland)

#ifdef __cplusplus
class B;
class A {
        void f() {}
        void g();
        B *b;
};
class B : public A {};
void A::g() { b->f(); } //Error: E2247
#endif
 
A100:

Cela ne change pas grand chose - erreur de compilation (j'ai une tablette - compilateur Borland)

Hmm, il faut donc consulter les normes du langage et voir quel compilateur se trompe.
Raison: