Erreurs, bugs, questions - page 1615

 

Erreur de compilation :

class A
{ 
};

template<typename T>  void func(T *const &a[])  { } 


void OnStart()
  {
    A *const a[] = { NULL };
    func(a);      //  'a' - cannot convert from const pointer to nonconst pointer
  }
 

Voici quelques autres erreurs :

template<typename T> void F(T)
{
  class A
  {
    void f()  { new A; }  // 'A' - declaration without type
        
    void g()  { A* a; }   // 'A' - pointer to this function type is not supported yet
  };
};


void OnStart()
  {
    F(0);
  }
 

Et il y a aussi un problème avec la conversion des pointeurs.

Le code suivant ne compile pas :

class A
{
};

class B : protected A
{
};

void OnStart()
  {
    A* a;
    B* b= (B*)a;  // conversion from 'B *' to 'A *' is not accessible because of inheritance access
  }

bien que la conversion soit explicite ici. Tout fonctionne en C++.

 
Alexey Navoykov:

Et il y a aussi quelque chose d'anormal dans le fait d'amener les panneaux indicateurs.

C'est vrai, le compilateur jure.
 
Комбинатор:
C'est vrai, le compilateur se bat.
Qu'est-ce qui va bien ? Ouvrez C++ et vérifiez comment ça doit être.
 
Alexey Navoykov:
Lisez les articles sur dynamic_cast, static_cast et reinterpret_cast et sachez quand les utiliser correctement et quand ne pas le faire.
 
Комбинатор:
Allez lire ce qui concerne le dynamic_cast, le static_cast et le reinterpret_cast et quand les utiliser correctement et quand ne pas le faire.
Évitons les flots et la philosophie inutiles, d'accord ? Nous parlons d'une construction spécifique qui doit être compilée.
 
Alexey Navoykov:

Le C++ convertit ce code en reinterpret_cast et le MQL en dynamic_cast. Et d'après ce que je comprends, c'est exactement le cas lorsque le compilateur peut trouver une erreur de dynamiccast pendant la compilation.

reinterpret_cast est illégitime dans ce cas, donc le fait que ce code compile en C++ n'est pas un argument.

 
Комбинатор:

Le C++ convertit ce code en reinterpret_cast et le MQL en dynamic_cast. Et pour autant que je sache, c'est exactement le cas lorsque le compilateur peut trouver une erreur de dynamiccast pendant la compilation.

Reinterpret_cast est illégitime dans ce cas, donc le fait que ce code compile en C++ n'est pas un argument.

Attends, pourquoi tu mélanges les choses ? Qu'est-ce que le dynamic cast a à voir là-dedans ? Les tâches du compilateur ne consistent pas à jouer les Sherlock Holmes et à chercher quelque chose dans la logique du programme. Il ne fait qu'une vérification formelle de la conformité avec la norme du langage, rien de plus. Et tout est correct du point de vue de la norme.

Si vous aviez regardé attentivement mon exemple, vous auriez vu que le problème était lié à protected. Si vous le changez en public, tout est ok. L'objet lui-même n'est pas modifié à cause de cela, c'est-à-dire que le compilateur MQL a juste une restriction inutile, c'est tout.

Ne spéculez donc pas et ne cherchez pas une signification secrète là où il n'y en a pas, qui n'est qu'une banale erreur de compilation.

 
Ouais, je suppose que j'ai tort après tout.