Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que j'obtiens une erreur \'Référence non définie à \'Bar::kConst\'\' lors de l'utilisation d'un membre static const int dans une fonction ?

Pourquoi est-ce que j'obtiens une erreur \'Référence non définie à \'Bar::kConst\'\' lors de l'utilisation d'un membre static const int dans une fonction ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 19:29:03857parcourir

Why do I get an

Référence non définie à Static const int

Question :

Considérez le code suivant :

<code class="cpp">class Bar {
public:
  static const int kConst = 1;
  void func() { foo(kConst); }
};

int main() { Bar b; b.func(); }</code>

Lors de la compilation de ce code, une erreur se produit : "Référence non définie à 'Bar::kConst'". Pourquoi cela se produit-il et comment peut-il être résolu ?

Réponse :

Cette erreur se produit car les membres static const int, s'ils sont utilisés (passés aux fonctions ou cast) , doit être défini dans une portée d'espace de noms.

Selon la section 9.4.2/4 de C 11 :

"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 de constante qui doit être une expression constante intégrale. 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. 🎜>

Le passage du membre de données statique par référence const constitue une "utilisation" selon C 11 section 3.2/2 :

"Une expression est potentiellement évaluée sauf si ... est l'opérande de l'opérateur sizeof, ... ou est l'opérande de l'opérateur typeid et ... ne désigne pas une lvalue de type classe polymorphe. Un objet ou une fonction non surchargée est utilisé si son nom apparaît dans une expression potentiellement évaluée."

Cependant, GCC autorisait initialement le passage de membres const statiques par référence const sans les définir dans une portée d'espace de noms. Dans les brouillons C 0x, cela n'est plus autorisé.

Un problème pratique survient lors de la prise d'adresses ou de références à des objets inexistants comme les membres const statiques. Cela pourrait conduire à un comportement indéfini s'ils sont appelés à partir de plusieurs unités de traduction.

Pour résoudre ce problème, les modifications suivantes peuvent être apportées :

  • Définir le membre const statique dans une portée d'espace de noms :

    <code class="cpp">int bar::kConst = 1;</code>
  • Utilisez static_cast(kConst) pour forcer le compilateur à créer un objet int temporaire et à lui transmettre une référence :

    <code class="cpp">foo(static_cast<int>(kConst));</code>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn