Erreur de liaison lors de la définition de membres entiers const statiques dans la définition de classe
Les déclarations de classe en C permettent la définition de membres entiers const statiques dans le classe. Cependant, les utilisateurs peuvent rencontrer des erreurs de l'éditeur de liens avec un code similaire à l'exemple fourni :
class test { public: static const int N = 10; }; int main() { std::cout << test::N << "\n"; std::min(9, test::N); }
Bien que le compilateur accepte la définition de classe, l'éditeur de liens signale une référence non définie à test::N. Le problème se pose car la déclaration dans la classe n'est pas une vraie définition.
En C , les membres intégraux const statiques doivent être définis en dehors de la classe dans une portée d'espace de noms. En effet, ils ne peuvent pas être initialisés dans la déclaration de classe selon la norme C (9.4.2/4) :
Si une donnée membre statique est de type const intégral ou const énumération, sa déclaration dans la définition de classe peut spécifier un initialiseur constant [...] Dans ce cas, le membre peut apparaître dans des expressions constantes intégrales. Le membre doit toujours être défini dans une portée d'espace de noms s'il est utilisé dans le programme et la définition de la portée de l'espace de noms ne doit pas contenir d'initialiseur.
Pour résoudre l'erreur de l'éditeur de liens, on peut définir le membre const statique en dehors de la classe , généralement dans le fichier source correspondant :
const int test::N = 10;
Alternativement, pour C 11 et versions ultérieures, le mot-clé constexpr peut être utilisé pour créer une véritable définition au sein de la classe déclaration :
class test { public: static constexpr int N = 10; };
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!