error de calificación adicional en C ++

120

Tengo una función miembro que se define de la siguiente manera:

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

Cuando compilo la fuente, obtengo:

error: calificación adicional 'JSONDeserializer ::' en el miembro 'ParseValue'

¿Que es esto? ¿Cómo elimino este error?

prosseek
fuente

Respuestas:

209

Esto se debe a que tiene el siguiente código:

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

Esto no es C ++ válido pero Visual Studio parece aceptarlo. Debe cambiarlo al siguiente código para poder compilarlo con un compilador compatible con el estándar (gcc es más compatible con el estándar en este punto).

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

El error proviene del hecho de que JSONDeserializer::ParseValuees un nombre calificado (un nombre con una calificación de espacio de nombres), y ese nombre está prohibido como nombre de método en una clase.

Sylvain Defresne
fuente
1
¿Hay alguna forma de hacer que Visual Studio advierta sobre esto?
altumano
1
@altumano: No, pero Cppcheck puede hacer eso y también detectar caracteres no ASCII en identificadores, lo que ayuda a mantener el código más portátil para gcc.
diente afilado
@sharptooth: gracias, Cppcheck puede detectar esos errores. Incluso hay un complemento de Visual Studio para Cppcheck (pero tiene errores y no se detecta en todos los archivos)
altumano
3
@altumano: ¿Es esto github.com/VioletGiraffe/cppcheck-vs-addin ? Si es así, ¿podría informar el error? Ese proyecto está bastante activo y hay muchas posibilidades de que se solucione.
diente afilado
Hola desde el futuro. Ahora puede forzar a MSVC a advertir sobre esto, habilitando la advertencia C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… . Iría tan lejos como para que se informe como un error, agregando el modificador del compilador / we4596
Len
19

Esto significa que una clase se menciona de forma redundante con una función de clase. Intenta eliminarJSONDeserializer::

joe_coolish
fuente
13

¿Estás poniendo esta línea dentro de la declaración de clase? En ese caso, debe eliminar el JSONDeserializer::.

Boaz Yaniv
fuente
6

Una nota digna de legibilidad / mantenibilidad:

Puede mantener el JSONDeserializer::calificador con la definición en su archivo de implementación (* .cpp).

Siempre que su declaración de clase (como lo mencionaron otros) no tenga el calificador, g ++ / gcc funcionará bien.

Por ejemplo:

En myFile.h:

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

Y en myFile.cpp:

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

Cuando myFile.cpp implementa métodos de muchas clases, ayuda saber quién pertenece a quién, con solo mirar la definición.

búnker
fuente
JSONDeserializer::para el archivo cpp (o la definición en general) es necesario. De lo contrario, obtienes una referencia indefinida. coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
Zoe