Ich habe den folgenden Code (vereinfacht), die in gcc fein kompiliert, sondern gibt einen Fehler in VS:VS2013 - static const definiert bereits
// main.cpp
#include "test.h"
int main() {
return 0;
}
// test.h
#pragma once
class Test {
static const int TEST = 3;
};
// test.cpp
#include "test.h"
const int Test::TEST;
Fehler:
main.obj : error LNK2005: "private: static int const Test::TEST" ([email protected]@@0HB) already defined in test.obj
Ist es ein VS Bug oder ist gcc falsch erlaubt mir das statische const Mitglied explizit zu definieren?
Update: fanden diese in der C++ Standard (9.4.2.3):
If a non-volatile const static data member is of integral or enumeration type, its declaration in the class definition can specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression (5.20). A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression. [ Note: In both these cases, the member may appear in constant expressions. — end note ] The member shall still be defined in a namespace scope if it is odr-used (3.2) in the program and the namespace scope definition shall not contain an initializer.
Update # 2: ein bug report gefunden, die behauptet, dass es in der nächste große Version fixiert ist.
Was passiert, wenn Sie 'const int Test :: TEST;' von Ihrer 'test.cpp' entfernen, wird gcc den Code kompilieren? – ixSci
Es scheint zu funktionieren, aber ich arbeite mit Code, der explizit diese Zeilen definiert und nicht bearbeiten will, da es beim nächsten svn-Update wieder kaputt gehen wird. – riv
Danke, ich wollte nur wissen, ob gcc einen Fehler anderer Art hat. Ich dachte, es erfordert, dass Sie die Konstante in allen Fällen explizit definieren. Wenn dies nicht der Fall ist, gibt es nur einen Fehler in MSVC. – ixSci