dodatkowy błąd kwalifikacji w C ++

120

Mam funkcję członka, która jest zdefiniowana w następujący sposób:

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

Kiedy kompiluję źródło, otrzymuję:

błąd: dodatkowa kwalifikacja „JSONDeserializer ::” w elemencie „ParseValue”

Co to jest? Jak usunąć ten błąd?

prosseek
źródło

Odpowiedzi:

209

Dzieje się tak, ponieważ masz następujący kod:

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

To nie jest poprawne C ++, ale wydaje się, że program Visual Studio to akceptuje. Musisz zmienić go na następujący kod, aby móc go skompilować za pomocą kompilatora zgodnego ze standardem (gcc jest bardziej zgodny ze standardem w tym punkcie).

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

Błąd wynika z faktu, że JSONDeserializer::ParseValuejest to nazwa kwalifikowana (nazwa z kwalifikacją przestrzeni nazw), a taka nazwa jest zabroniona jako nazwa metody w klasie.

Sylvain Defresne
źródło
1
Czy istnieje sposób, aby program Visual Studio ostrzegał o tym?
altumano
1
@altumano: Nie, ale Cppcheck może to zrobić, a także wykryć znaki spoza ASCII w identyfikatorach, co pomaga utrzymać kod bardziej przenośny do gcc.
ostry ząb
@sharptooth: dzięki, Cppcheck rzeczywiście może wykryć te błędy. Jest nawet Visual Studio plugin dla Cppcheck (ale to wadliwa i nie wykrywa wszystkich plików)
altumano
3
@altumano: Czy chodzi o to, że github.com/VioletGiraffe/cppcheck-vs-addin ? Jeśli tak, to czy mógłbyś zgłosić błąd - ten projekt jest całkiem żywy i istnieje duża szansa, że ​​zostanie naprawiony.
ostry ząb
Witam z przyszłości. Możesz teraz zmusić MSVC do ostrzeżenia o tym, włączając ostrzeżenie C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… . Poszedłbym tak daleko, że zostałbym zgłoszony jako błąd, dodając przełącznik kompilatora / we4596
Len
19

Oznacza to, że klasa jest redundantnie wspominana z funkcją klasy. Spróbuj usunąćJSONDeserializer::

joe_coolish
źródło
13

Czy umieszczasz ten wiersz wewnątrz deklaracji klasy? W takim przypadku należy usunąć plik JSONDeserializer::.

Boaz Yaniv
źródło
6

Godna uwaga dotycząca czytelności / łatwości konserwacji:

JSONDeserializer::Kwalifikator można zachować wraz z definicją w pliku implementacji (* .cpp).

Dopóki twoja deklaracja w klasie (jak wspominali inni) nie ma kwalifikatora, g ++ / gcc będzie działał dobrze.

Na przykład:

W myFile.h:

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

A w myFile.cpp:

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

Kiedy myFile.cpp implementuje metody z wielu klas, wystarczy spojrzeć na definicję, aby wiedzieć, kto należy do kogo.

bunkerdive
źródło
JSONDeserializer::dla pliku CPP (lub ogólnie definicji) jest wymagana. W przeciwnym razie otrzymasz niezdefiniowane odniesienie. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe