errore di qualificazione aggiuntivo in C ++


120

Ho una funzione membro definita come segue:

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

Quando compilo il sorgente, ottengo:

errore: qualifica extra "JSONDeserializer ::" sul membro "ParseValue"

Cos'è questo? Come rimuovo questo errore?

Risposte:


209

Questo perché hai il seguente codice:

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

Questo non è un C ++ valido ma Visual Studio sembra accettarlo. È necessario modificarlo nel codice seguente per poterlo compilare con un compilatore conforme allo standard (gcc è più conforme allo standard su questo punto).

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

L'errore deriva dal fatto che JSONDeserializer::ParseValueè un nome completo (un nome con una qualifica di spazio dei nomi) e tale nome è vietato come nome di metodo in una classe.


1
Esiste un modo per avvisare Visual Studio di questo?
altumano

1
@altumano: No, ma Cppcheck può farlo e rileva anche caratteri non ASCII negli identificatori che aiutano a mantenere il codice più portabile su gcc.
punta di diamante

@sharptooth: grazie, Cppcheck può effettivamente rilevare quegli errori. C'è anche un plug-in Visual Studio per Cppcheck (ma è bacato e non viene rilevato in tutti i file)
altumano

3
@altumano: è questa cosa github.com/VioletGiraffe/cppcheck-vs-addin ? In tal caso, potresti segnalare il bug: il progetto è abbastanza vivo e ci sono buone probabilità che venga risolto.
punta di diamante

Ciao dal futuro. È ora possibile forzare MSVC a segnalare questo problema, abilitando l'avviso C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… . Mi spingerei a riportarlo come errore, aggiungendo l'opzione del compilatore / we4596
Len

19

Ciò significa che una classe viene menzionata in modo ridondante con una funzione di classe. Prova a rimuovereJSONDeserializer::


13

Stai inserendo questa riga nella dichiarazione della classe? In tal caso dovresti rimuovere il file JSONDeserializer::.


6

Una nota degna di leggibilità / manutenibilità:

È possibile mantenere il JSONDeserializer::qualificatore con la definizione nel file di implementazione (* .cpp).

Finché la tua dichiarazione in classe (come menzionato da altri) non ha il qualificatore, g ++ / gcc funzionerà bene.

Per esempio:

In myFile.h:

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

E in myFile.cpp:

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

Quando myFile.cpp implementa metodi di molte classi, aiuta a sapere chi appartiene a chi, semplicemente guardando la definizione.


JSONDeserializer::per il file cpp (o la definizione in generale) è richiesto. Altrimenti, ottieni un riferimento indefinito. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.