erreur de qualification supplémentaire en C ++


120

J'ai une fonction membre définie comme suit:

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

Lorsque je compile la source, j'obtiens:

erreur: qualification supplémentaire 'JSONDeserializer ::' sur le membre 'ParseValue'

Qu'est-ce que c'est? Comment supprimer cette erreur?

Réponses:


209

C'est parce que vous avez le code suivant:

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

Ce n'est pas du C ++ valide mais Visual Studio semble l'accepter. Vous devez le remplacer par le code suivant pour pouvoir le compiler avec un compilateur conforme au standard (gcc est plus conforme au standard sur ce point).

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

L'erreur vient du fait qu'il JSONDeserializer::ParseValues'agit d'un nom qualifié (un nom avec une qualification d'espace de noms), et un tel nom est interdit en tant que nom de méthode dans une classe.


1
Existe-t-il un moyen d'avertir Visual Studio à ce sujet?
altumano

1
@altumano: Non, mais Cppcheck peut le faire et aussi détecter les caractères non ASCII dans les identificateurs, ce qui permet de maintenir le code plus portable vers gcc.
sharptooth

@sharptooth: merci, Cppcheck peut en effet détecter ces erreurs. Il existe même un plugin Visual Studio pour Cppcheck (mais il est bogué et ne détecte pas dans tous les fichiers)
altumano

3
@altumano: Est-ce ce truc github.com/VioletGiraffe/cppcheck-vs-addin ? Si tel est le cas, veuillez signaler le bogue - ce projet est bien vivant et il y a de fortes chances qu'il soit corrigé.
Sharptooth

Bonjour du futur. Vous pouvez maintenant forcer MSVC à avertir à ce sujet en activant l'avertissement C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… . J'irais jusqu'à ce qu'il soit signalé comme une erreur, en ajoutant le commutateur de compilateur / we4596
Len

19

Cela signifie qu'une classe est mentionnée de manière redondante avec une fonction de classe. Essayez de supprimerJSONDeserializer::


13

Mettez-vous cette ligne dans la déclaration de classe? Dans ce cas, vous devez supprimer le fichier JSONDeserializer::.


6

Une note intéressante pour la lisibilité / maintenabilité:

Vous pouvez conserver le JSONDeserializer::qualificatif avec la définition dans votre fichier d'implémentation (* .cpp).

Tant que votre déclaration en classe (comme mentionné par d'autres) n'a pas le qualificatif, g ++ / gcc jouera bien.

Par exemple:

Dans myFile.h:

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

Et dans myFile.cpp:

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

Lorsque myFile.cpp implémente des méthodes de nombreuses classes, il est utile de savoir qui appartient à qui, simplement en regardant la définition.


JSONDeserializer::pour le fichier cpp (ou la définition en général) est requis. Sinon, vous obtenez une référence non définie. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.