zusätzlicher Qualifikationsfehler in C ++

120

Ich habe eine Mitgliedsfunktion, die wie folgt definiert ist:

Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString);

Wenn ich die Quelle kompiliere, erhalte ich:

Fehler: zusätzliche Qualifikation 'JSONDeserializer ::' für Mitglied 'ParseValue'

Was ist das? Wie entferne ich diesen Fehler?

prosseek
quelle

Antworten:

209

Dies liegt daran, dass Sie den folgenden Code haben:

class JSONDeserializer
{
    Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString);
};

Dies ist kein gültiges C ++, aber Visual Studio scheint es zu akzeptieren. Sie müssen es in den folgenden Code ändern, um es mit einem standardkompatiblen Compiler kompilieren zu können (gcc entspricht in diesem Punkt eher dem Standard).

class JSONDeserializer
{
    Value ParseValue(TDR type, const json_string& valueString);
};

Der Fehler JSONDeserializer::ParseValueergibt sich aus der Tatsache, dass es sich um einen qualifizierten Namen handelt (ein Name mit einer Namespace-Qualifikation), und ein solcher Name ist als Methodenname in einer Klasse verboten.

Sylvain Defresne
quelle
1
Gibt es eine Möglichkeit, Visual Studio davor zu warnen?
Altumano
1
@altumano: Nein, aber Cppcheck kann das und erkennt auch Nicht-ASCII-Zeichen in Bezeichnern, wodurch der Code für gcc portabler bleibt.
Scharfzahn
@sharptooth: Danke, Cppcheck kann diese Fehler tatsächlich erkennen. Es gibt sogar ein Visual Studio-Plugin für Cppcheck (aber es ist fehlerhaft und wird nicht in allen Dateien
erkannt
3
@altumano: Ist es das Ding github.com/VioletGiraffe/cppcheck-vs-addin ? Wenn ja, könnten Sie bitte den Fehler melden - das Projekt ist ziemlich lebendig und es besteht eine gute Chance, dass es behoben wird.
Scharfzahn
Hallo aus der Zukunft. Sie können MSVC jetzt zwingen, davor zu warnen, indem Sie die Warnung C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… aktivieren . Ich würde so weit gehen, dass es als Fehler gemeldet wird, indem ich den Compiler-Schalter / we4596
Len
19

Dies bedeutet, dass eine Klasse mit einer Klassenfunktion redundant erwähnt wird. Versuchen Sie es zu entfernenJSONDeserializer::

joe_coolish
quelle
13

Fügen Sie diese Zeile in die Klassendeklaration ein? In diesem Fall sollten Sie die entfernen JSONDeserializer::.

Boaz Yaniv
quelle
6

Ein Hinweis für die Lesbarkeit / Wartbarkeit:

Sie können das JSONDeserializer::Qualifikationsmerkmal mit der Definition in Ihrer Implementierungsdatei (* .cpp) behalten.

Solange Ihre In-Class-Deklaration (wie von anderen erwähnt) nicht über das Qualifikationsmerkmal verfügt, spielt g ++ / gcc eine gute Rolle.

Beispielsweise:

In myFile.h:

class JSONDeserializer
{
    Value ParseValue(TDR type, const json_string& valueString);
};

Und in myFile.cpp:

Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString)
{
    do_something(type, valueString);
}

Wenn myFile.cpp Methoden aus vielen Klassen implementiert, ist es hilfreich zu wissen, wer zu wem gehört, indem Sie sich nur die Definition ansehen.

Bunkerdive
quelle
JSONDeserializer::für die cpp-Datei (oder die Definition im Allgemeinen) ist erforderlich. Andernfalls erhalten Sie eine undefinierte Referenz. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe