Nach meinem Verständnis können in C ++ statische const-Mitglieder innerhalb einer Klasse definiert werden, sofern es sich um einen Integer-Typ handelt.
Warum gibt mir der folgende Code dann einen Linkerfehler?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
Der Fehler, den ich bekomme, ist:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Interessanterweise kompiliert und verknüpft der Code, wenn ich den Aufruf von std :: min auskommentiere, einwandfrei (obwohl auf test :: N auch in der vorherigen Zeile verwiesen wird).
Irgendeine Idee, was los ist?
Mein Compiler ist gcc 4.4 unter Linux.
char
können Sie es stattdessen als definieren constexpr static const char &N = "n"[0];
. Beachten Sie die &
. Ich denke, das funktioniert, weil Literal-Strings automatisch definiert werden. Ich mache mir allerdings ein bisschen Sorgen darüber - es könnte sich in einer Header-Datei zwischen verschiedenen Übersetzungseinheiten seltsam verhalten, da sich die Zeichenfolge wahrscheinlich an mehreren verschiedenen Adressen befindet.
inline const int N = 10
, das meines Wissens immer noch einen Speicher hat, der irgendwo durch Linker definiert ist. Schlüsselwort inline könnte auch in diesem Fall verwendet werden , um statische Variable zu schaffen Definition innerhalb der Klassendefinition Tests.