додаткова помилка кваліфікації в 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: дякую, Cppcheck дійсно може виявити ці помилки. Існує навіть плагін Visual Studio для Cppcheck (але він баггі і не виявляється у всіх файлах)
altumano

3
@altumano: Це ця штука github.com/VioletGiraffe/cppcheck-vs-addin ? Якщо так, ви можете повідомити про помилку - цей проект є досить живим, і є хороший шанс, що він буде виправлений.
гострий зуб

Привіт від майбутнього. Тепер ви можете змусити 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
Zoe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.