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 méthode de classe ?

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 méthode de classe ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-23 08:41:17746parcourir

Why Do I Get an

Référence non définie au char constexpr statique[]

Lorsque vous tentez d'accéder à un tableau de caractères constexpr statique dans une méthode de classe, vous pouvez rencontrer une erreur "référence non définie". Ce problème survient lorsque la déclaration et l'initialisation du tableau se produisent dans la définition de la classe, mais que la définition elle-même est omise.

Problème :

// header file (.hpp)
struct foo {
  void bar();
  static constexpr char baz[] = "quz"; // Declaration and initialization
};

// implementation file (.cpp)
void foo::bar() {
  std::string str(baz); // "undefined reference to baz" error
}

Solution :

Pour résoudre ce problème, vous devez fournir une définition distincte pour le membre statique dans le fichier d'implémentation (.cpp) dans ajout à la déclaration dans la définition de classe (.hpp) :

// implementation file (.cpp)
constexpr char foo::baz[]; // Definition

Explication :

Le compilateur a besoin à la fois de la déclaration et de la définition du membre statique pour connaître son emplacement mémoire et sa valeur initiale. La déclaration dans la définition de classe spécifie uniquement le type et le nom du membre, tandis que la définition fournit l'allocation de mémoire et l'initialisation réelles. En séparant la définition de la déclaration, vous vous assurez que le compilateur dispose de toutes les informations nécessaires pour lier le membre à sa définition lors de la compilation.

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