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?

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.


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::


13

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.