дополнительная ошибка квалификации в C ++


120

У меня есть функция-член, которая определяется следующим образом:

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

Когда я компилирую исходник, я получаю:

ошибка: дополнительная квалификация 'JSONDeserializer ::' для члена 'ParseValue'

Что это? Как мне удалить эту ошибку?

Ответы:


209

Это потому, что у вас есть следующий код:

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

Это недопустимый C ++, но Visual Studio, похоже, его принимает. Вам нужно изменить его на следующий код, чтобы иметь возможность скомпилировать его с помощью стандартного совместимого компилятора (gcc более соответствует стандарту в этом отношении).

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

Ошибка возникает из-за того, что JSONDeserializer::ParseValueэто полное имя (имя с квалификацией пространства имен), и такое имя запрещено в качестве имени метода в классе.


1
Есть ли способ заставить Visual Studio предупредить об этом?
altumano

1
@altumano: Нет, но Cppcheck может это сделать, а также обнаруживать символы, отличные от ASCII, в идентификаторах, что помогает поддерживать код, более переносимый в gcc.
Sharptooth

@sharptooth: спасибо, Cppcheck действительно может обнаружить эти ошибки. Есть даже плагин Visual Studio для Cppcheck (но он глючит и обнаруживается не во всех файлах)
altumano

3
@altumano: Это что, github.com/VioletGiraffe/cppcheck-vs-addin ? Не могли бы вы сообщить об ошибке - этот проект жив, и есть большая вероятность, что он будет исправлен.
Sharptooth 06

Привет из будущего. Теперь вы можете заставить MSVC предупреждать об этом, включив предупреждение C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… . Я бы пошел так далеко, что сообщил об ошибке, добавив переключатель компилятора / we4596
Лен

19

Это означает, что класс избыточно упоминается с функцией класса. Попробуйте удалитьJSONDeserializer::


13

Вы положить эту строку внутри объявления класса? В этом случае вам следует удалить JSONDeserializer::.


6

Достойное замечание для удобочитаемости / ремонтопригодности:

Вы можете сохранить JSONDeserializer::квалификатор с определением в вашем файле реализации (* .cpp).

Пока ваше объявление класса (как упоминалось другими) не имеет квалификатора, g ++ / gcc будет работать нормально.

Например:

В myFile.h:

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

И в myFile.cpp:

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

Когда myFile.cpp реализует методы из многих классов, это помогает узнать, кто кому принадлежит, просто взглянув на определение.


JSONDeserializer::для файла cpp (или определения в целом) не требуется. В противном случае вы получите неопределенную ссылку. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Зоя
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.