erro de qualificação extra em C ++

120

Eu tenho uma função de membro que é definida da seguinte maneira:

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

Quando compilo o código-fonte, obtenho:

erro: qualificação extra 'JSONDeserializer ::' no membro 'ParseValue'

O que é isso? Como faço para remover esse erro?

prosseek
fonte

Respostas:

209

Isso ocorre porque você tem o seguinte código:

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

Isso não é C ++ válido, mas o Visual Studio parece aceitá-lo. Você precisa alterá-lo para o código a seguir para poder compilá-lo com um compilador compatível com o padrão (o gcc é mais compatível com o padrão neste ponto).

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

O erro vem do fato de que JSONDeserializer::ParseValueé um nome qualificado (um nome com uma qualificação de namespace) e esse nome é proibido como nome de método em uma classe.

Sylvain Defresne
fonte
1
Existe alguma maneira de fazer o Visual Studio avisar sobre isso?
altumano
1
@altumano: Não, mas Cppcheck pode fazer isso e também detectar caracteres não ASCII em identificadores, o que ajuda a manter o código mais portável para o gcc.
sharptooth
@sharptooth: obrigado, Cppcheck pode realmente detectar esses erros. Existe até um plugin do Visual Studio para Cppcheck (mas é bugado e não detecta em todos os arquivos)
altumano
3
@altumano: É isso github.com/VioletGiraffe/cppcheck-vs-addin ? Se sim, você poderia relatar o bug - esse projeto está bem ativo e há uma boa chance de ser corrigido.
sharptooth
Olá do futuro. Agora você pode forçar o MSVC a avisar sobre isso, ativando o aviso C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… . Eu chegaria ao ponto de reportar isso como um erro, adicionando a opção do compilador / we4596
Len
19

Isso significa que uma classe é mencionada redundantemente com uma função de classe. Tente removerJSONDeserializer::

joe_coolish
fonte
13

Você está colocando esta linha dentro da declaração da classe? Nesse caso, você deve remover o JSONDeserializer::.

Boaz Yaniv
fonte
6

Uma nota importante para legibilidade / manutenção:

Você pode manter o JSONDeserializer::qualificador com a definição em seu arquivo de implementação (* .cpp).

Contanto que sua declaração em classe (como mencionado por outros) não tenha o qualificador, g ++ / gcc funcionará bem.

Por exemplo:

In myFile.h:

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

E em myFile.cpp:

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

Quando myFile.cpp implementa métodos de muitas classes, ajuda a saber quem pertence a quem, apenas olhando para a definição.

bunkerdive
fonte
JSONDeserializer::para o arquivo cpp (ou a definição em geral) é necessária. Caso contrário, você obtém uma referência indefinida. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe