Heim > Artikel > Backend-Entwicklung > Warum erhalte ich die Fehlermeldung „Undefinierter Verweis auf „Bar::kConst““, wenn ich in einer Funktion ein statisches const int-Mitglied verwende?
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>
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>Verwenden Sie static_cast
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!