Maison >développement back-end >C++ >Pourquoi est-ce que j'obtiens une erreur « Référence non définie » lors de l'utilisation d'un tableau de caractères constexpr statique dans une classe C ?
Référence non définie à Static constexpr char[]
En C, lors de la déclaration d'un tableau de caractères const statique dans une classe et de son utilisation dans un fonction membre, on peut rencontrer une erreur indiquant une référence non définie. Cette erreur survient en raison de la séparation entre la déclaration et la définition dans les membres statiques.
Problème
Considérez l'exemple suivant :
// header file (foo.hpp) struct Foo { void bar(); static constexpr char baz[] = "qux"; }; // cpp file (foo.cpp) void Foo::bar() { std::string str(baz); // undefined reference to baz }
Dans ce Par exemple, le tableau de caractères statique const baz est déclaré dans la classe mais n'est pas défini. La compilation du code avec GCC entraînera l'erreur "référence non définie à baz."
Solution
Pour résoudre ce problème, vous devez fournir une définition pour le code statique membre dans le fichier cpp. Cette définition spécifie le contenu réel du tableau. Dans l'exemple ci-dessus, ajoutez la ligne suivante au fichier cpp :
constexpr char Foo::baz[];
Explication
En C , les membres statiques nécessitent à la fois une déclaration et une définition, ce qui sont des entités distinctes. La déclaration spécifie le type et le nom du membre, tandis que la définition fournit son implémentation ou sa valeur réelle.
Pour les membres statiques déclarés dans une classe, la déclaration apparaît généralement dans la définition de la classe, avec tout initialiseur. Cependant, la définition doit être fournie en dehors de la définition de la classe, généralement dans un fichier cpp séparé ou à la fin de la définition de la classe.
En fournissant une définition pour le membre statique baz, l'éditeur de liens pourra résoudre sa référence et générer le code nécessaire. Sans la définition, l'éditeur de liens ne peut pas déterminer le contenu réel du tableau et entraînera une erreur de référence non définie.
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!