E2031 Transtypage impossible de 'type1' en 'type2' (C++)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Erreurs et avertissements du compilateur (C++) - Index

La conversion du type 'ident1' en type 'ident2' n'est pas autorisée.

En C++, vous ne pouvez pas convertir un pointeur de fonction membre en pointeur de fonction normal.

Par exemple :

class A {
public:
   int myex();
};
typedef int (*fp)();
test()
{
   fp myfp = (fp) &A::myex; //erreur
   return myfp();
}

Ceci est dû au fait qu'une fonction membre classe accepte un paramètre masqué, le pointeur this, et donc se comporte différemment d'un pointeur de fonction normal.

Une fonction membre statique se comporte comme un pointeur de fonction normal et peut être transtypée.

Par exemple :

class A {
public:
   static int myex();
};
typedef int (*fp)();
test()
{
   fp myfp = (fp) &A::myex; //ok
   return myfp();
}

Cependant, les fonctions membre statiques ne peuvent accéder qu'aux données membre statiques de la classe.

En C

  • Un pointeur peut être converti en un type intégral ou en un autre pointeur.
  • Un type intégral peut être converti en n'importe quel type intégral, flottant ou pointeur.
  • Un type flottant peut être converti en type intégral ou flottant.

Les structures et les tableaux ne peuvent pas être convertis.

Il est en général impossible de convertir un type void.

En C++

Les conversions et les constructeurs définis par l'utilisateur sont vérifiés. Si l'un est introuvable, les règles précédentes s'appliquent (sauf pour les pointeurs sur des membres de classe).

Parmi les types intégraux, seule une constante zéro peut être convertie en pointeur de membre.

Un pointeur de membre peut être converti en type intégral ou en un pointeur de membre similaire.

Un pointeur de membre similaire pointe sur des données membre (ou sur une fonction) si l'original le fait. La classe qualifiante du type en cours de conversion doit être la même que celle de (ou une classe de base de) l'original.