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?

prosseek
la source

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.

Sylvain Defresne
la source
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::

joe_coolish
la source
13

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

Boaz Yaniv
la source
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.

plongée au bunker
la source
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