C ++中的额外资格错误


120

我有一个成员函数,定义如下:

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

当我编译源代码时,我得到:

错误:成员'ParseValue'上的额外限定'JSONDeserializer :::'

这是什么?如何清除此错误?

Answers:


209

这是因为您具有以下代码:

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

这不是有效的C ++,但Visual Studio似乎接受它。您需要将其更改为以下代码,以便能够使用符合标准的编译器进行编译(此时,gcc更符合该标准)。

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

该错误来自以下事实:JSONDeserializer::ParseValue限定名称(具有名称空间限定的名称),并且在类中禁止将该名称作为方法名称使用。


1
有什么方法可以使Visual Studio对此发出警告?
altumano

1
@altumano:否,但是Cppcheck可以做到这一点,并且还可以检测标识符中的非ASCII字符,这有助于使代码更易于gcc移植。
Sharptooth 2015年

@ sharptooth:谢谢,Cppcheck确实可以检测到这些错误。甚至还有一个用于Cppcheck的Visual Studio插件(但是它有故障,并且不能在所有文件中检测到)
altumano

3
@altumano:是这个东西github.com/VioletGiraffe/cppcheck-vs-addin吗?如果可以,请报告该错误-该项目还很活跃,很可能会得到修复。
Sharptooth

您好,《未来》。现在,您可以强制MSVC警告这一点,通过启用警告C4596 - docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/...。通过添加编译器开关/ we4596
Len

19

这意味着在类函数中多余地提到了一个类。尝试移除JSONDeserializer::



6

可读性/可维护性的重要说明:

您可以将JSONDeserializer::限定符和定义保留在实现文件(* .cpp)中。

只要您的类内声明(如其他人所述)没有限定符,g ++ / gcc就会发挥出色的作用。

例如:

在myFile.h中:

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

在myFile.cpp中:

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

当myFile.cpp实现许多类中的方法时,仅通过查看定义,有助于了解谁属于谁。


JSONDeserializer::需要cpp文件(或一般定义)。否则,您将获得未定义的引用。coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 coliru.stacked-crooked.com/a/6cd1efe94c09d521
佐伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.