Erreurs, bugs, questions - page 2272

 
fxsaber:

De plus, en f vous ne pourrez pas utiliser T. En somme, la situation est évidente pour moi.

De plus, vous avez violé votre interdiction d'utiliser T dans f

template<typename T>
void f() { class T; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

Comme vous pouvez le voir, il compile sans erreur, et le fait que le résultat soit absurde n'a pas d'importance tant que tout est "explicable".

 
Bonjour, tout le monde. Aide. Je ne peux pas faire de transactions en or, tout fonctionne, mais ce sont les transactions que je ne peux pas faire. Voici des captures d'écran de ce à quoi il ressemble.
Dossiers :
 

Quel est le sens sacré de ce code, pourquoi l'ont-ils intégré dans la bibliothèque standard?

   if(IsStopped(__FUNCTION__))
      return(false);

Il est désormais impossible d'utiliser les fonctions de fermeture de positions ou d'ordres de la bibliothèque standard dans OnDeanite, par exemple avec REASON_REMOVE.

 
Stanislav Dray:

Quel est le sens sacré de ce code, pourquoi l'ont-ils intégré dans la bibliothèque standard?

Désormais, vous ne pouvez pas utiliser les fonctions de clôture des positions ou des ordres de la bibliothèque standard dans OnDynit, par exemple avec REASON_REMOVE.

Oui, c'est un bug.

 
A100:

De plus, j'ai violé votre interdiction d'utiliser T dans f

Comme vous le voyez, il compile sans erreur, et le fait que le résultat soit absurde n'est pas important - l'essentiel est que tout soit "explicable".

Vous ne comprenez pas bien ce que sont les modèles. Ils sont similaires aux macros, mais avec certaines caractéristiques.

Voici le code

template<typename T>
void f() { class T{ MqlTick a; }; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

.

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

C'est parce que T est une configuration, comme les macros, mais avec certaines réserves. Ce que nous avons au final, c'est qu'une signature est créée. À l'intérieur de la fonction, personne ne connaît A qui est substitué à T dans la fonction. Mais vous définissez ce A à l'intérieur, donc aucune autre erreur de compilation ne se produit. J'ai inséré MqlTick à l'intérieur pour montrer que cette A n'a rien à voir avec les autres classes du même nom.

En bref, les intraclasses dans MQL5 ne sont pas visibles en dehors de la fonction parent. Seul le nom du type en tant que classe est transmis en tant que T. Dans ce cas, le nom n'a pas de référence à la fonction parentale.

C'est-à-dire que tout est explicable de manière tout à fait logique. Ce n'est pas un bug, mais une implémentation si limitée.


Lors d'un entretien d'embauche, un programmeur C++ pourrait dire que c'est impossible.

template<typename T>
void f() { class T{}; }


MQL5 est tout à fait possible.

 
fxsaber:

Vous ne comprenez pas bien ce que sont les modèles.

fxsaber:

ZS Un programmeur C++ vous dira probablement lors d'un entretien d'embauche que c'est impossible.

Si vous pensez que cela est impossible en C++, cela signifie que ce n'est pas moi mais vous qui ne comprenez pas ce que sont les templates et comment ils fonctionnent... d'autant plus qu'il est impossible de distinguer une implémentation bâclée d'une implémentation contrainte.

 
A100:

Si vous pensez qu'une telle chose est impossible en C++, cela signifie que ce n'est pas moi, mais que vous ne comprenez pas ce que sont les modèles et comment ils fonctionnent... d'autant plus qu'il est impossible de distinguer une implémentation bâclée d'une implémentation bornée.

Lisez le premier mot de la phrase sur laquelle vous donnez votre commentaire. Ma compréhension des modèles et des macros dans MQL5 est telle que je réalise sans essayer de compiler que vos exemples ne compileront pas dans MQL5. C++ - Je ne sais pas, cela ne l'empêche pas.


Je vous serais reconnaissant de montrer comment le C++ réagit à ce code.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

fxsaber, 2018.09.03 07:16

ZS Un programmeur C++ vous dira probablement lors d'un entretien d'embauche que c'est impossible.

template<typename T>
void f() { class T{}; }
 
fxsaber:

J'apprécierais si vous pouviez me montrer comment le C++ réagit à ce code.

La réaction est la même que pour le MQL. Pourquoi serait-il différent ? Un modèle est un modèle
 
fxsaber:

Vous ne comprenez pas vraiment ce que sont les modèles. Ils s'apparentent à des macros, mais avec quelques astuces.

Oui, cet exemple ne compilera pas sur les plus.

error : declaration of 'struct f()::T' shadows template param template<typename T>

mais même si elle compilait, le résultat vous surprendrait car le nom de la classe serait juste "T".

si c'est différent dans mql, c'est incorrect
 
TheXpert:

si c'est différent sur mql, c'est faux.

La discussion ne porte pas sur le droit, mais sur l'erreur présumée. Je pense qu'il n'y a pas d'erreur, c'est la façon dont la mise en œuvre est conçue pour le moment.