Heim > Backend-Entwicklung > C++ > Hauptteil

Warum erhalte ich die Fehlermeldung „Undefinierter Verweis auf „Bar::kConst'', wenn ich in einer Funktion ein statisches const int-Mitglied verwende?

Susan Sarandon
Freigeben: 2024-10-30 19:29:03
Original
777 Leute haben es durchsucht

Why do I get an

Undefinierter Verweis auf Static const int

Frage:

Bedenken Sie den folgenden Code:

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

int main() { Bar b; b.func(); }</code>
Nach dem Login kopieren

Beim Kompilieren dieses Codes tritt ein Fehler auf: „Undefinierter Verweis auf ‚Bar::kConst‘“. Warum tritt das auf und wie kann es behoben werden?

Antwort:

Dieser Fehler tritt auf, weil statische const int-Mitglieder verwendet werden (an Funktionen übergeben oder umgewandelt) , muss in einem Namespace-Bereich definiert werden.

Gemäß C 11 Abschnitt 9.4.2/4:

"Wenn ein statisches Datenelement vom Typ const integral oder const enumeration ist, wird seine Deklaration in Die Klassendefinition kann einen Konstanteninitialisierer angeben, der ein ganzzahliger Konstantenausdruck sein soll. In diesem Fall kann das Mitglied in einem Namespace-Bereich definiert werden, wenn es im Programm verwendet wird 🎜>

Die Übergabe des statischen Datenelements per Konstantenreferenz stellt eine „Verwendung“ gemäß C 11 Abschnitt 3.2/2 dar:

„Ein Ausdruck wird potenziell ausgewertet, es sei denn ... ist der Operand des sizeof-Operators, ... oder ist der Operand des Typ-ID-Operators und ... bezeichnet keinen L-Wert eines polymorphen Klassentyps. Ein Objekt oder eine nicht überladene Funktion wird verwendet, wenn sein Name in einem potenziell ausgewerteten Ausdruck erscheint 🎜>Allerdings erlaubte GCC zunächst die Übergabe statischer Const-Mitglieder per Const-Referenz, ohne sie in einem Namespace-Bereich zu definieren. In C 0x-Entwürfen ist dies nicht mehr zulässig.

Ein praktisches Problem tritt auf, wenn Adressen oder Verweise auf nicht vorhandene Objekte wie statische Const-Mitglieder übernommen werden. Dies könnte zu undefiniertem Verhalten führen, wenn sie von mehreren Übersetzungseinheiten aufgerufen werden.

Um dieses Problem zu beheben, können die folgenden Änderungen vorgenommen werden:

Definieren Sie das statische const-Mitglied in einem Namespace-Bereich:
  • <code class="cpp">int bar::kConst = 1;</code>
    Nach dem Login kopieren
    Verwenden Sie static_cast(kConst), um den Compiler zu zwingen, ein temporäres int-Objekt zu erstellen und einen Verweis darauf zu übergeben:

Das obige ist der detaillierte Inhalt vonWarum erhalte ich die Fehlermeldung „Undefinierter Verweis auf „Bar::kConst'', wenn ich in einer Funktion ein statisches const int-Mitglied verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!