Unaufgelöstes externes Symbol für statisches Objektfeld
In diesem Artikel wird die Fehlermeldung „Fehler LNK2001: unaufgelöstes externes Symbol“ untersucht, die beim Festlegen auftritt ein statisches Feld in einer Klasse aus der Hauptmethode.
Im bereitgestellten Code-Snippet die Deklaration des statischen Feldes „a“ in der Klasse „B“ kommt innerhalb der Klassendefinition selbst vor. Nach dem C-Standard gelten solche Deklarationen jedoch nicht als Definitionen. Für statische Datenelemente muss die richtige Definition außerhalb der Klasse im umschließenden Namespace-Bereich unter Verwendung des Operators „::“ erscheinen.
Die Regel, die diese Anforderung regelt, ist als One Definition Rule (ODR) bekannt. was vorschreibt, dass jede Entität (einschließlich statischer Datenelemente) eine einzige eindeutige Definition im gesamten Programm hat. Diese Regel stellt sicher, dass hinsichtlich des Werts des statischen Elements keine Unklarheiten bestehen.
Um den Fehler zu beheben, sollte der Code daher wie folgt geändert werden, wobei „a“ im Namespace-Bereich definiert ist:
class A
{
public:
A()
{
}
};
class B
{
public:
static A* a;
};
A* B::a; // Definition in namespace scope
int main()
{
B::a = new A;
}
Durch die explizite Definition des statischen Members außerhalb der Klasse kann der Linker die Symbolreferenz korrekt auflösen und der Code wird erfolgreich kompiliert.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3