C++中的额外资格错误

153

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

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

当我编译源代码时,出现以下错误:

error: extra qualification 'JSONDeserializer::' on member 'ParseValue'

这是什么意思?我该如何消除这个错误?

5个回答

279

这是因为你有以下代码:

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是一个限定名称(具有命名空间限定符的名称),而这样的名称在类中作为方法名称是被禁止的。


3
有没有办法让Visual Studio警告这个问题? - altumano
1
@altumano:不,但是Cppcheck可以做到这一点,并且可以检测标识符中的非ASCII字符,这有助于使代码更具可移植性到gcc。 - sharptooth
@sharptooth:谢谢,Cppcheck确实可以检测到这些错误。甚至有一个Cppcheck的Visual Studio插件(但它存在缺陷,不能在所有文件中检测到)。 - altumano
3
这个意思是说:@altumano问是否指这个 https://github.com/VioletGiraffe/cppcheck-vs-addin ?如果是,可以报告Bug - 那个项目仍然活跃,有很大的机会能够修复。 - sharptooth
1
来自未来的问候。您现在可以通过启用警告C4596(https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/c4596?view=vs-2019)来强制MSVC发出警告。我会进一步将其报告为错误,通过添加编译器开关/we4596。 - Len

25

这表示一个类被在类函数中多余地提及了。尝试移除JSONDeserializer::


16

你是将这行代码放在类声明内吗?如果是的话,你应该移除JSONDeserializer::


10

关于可读性/易维护性的值得注意的一点:

您可以在实现文件(*.cpp)中与定义一起使用JSONDeserializer ::限定符。

只要您的类内声明(如其他人所述)没有该限定符,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 实现了许多类的方法时,通过查看定义来知道谁属于谁会很有帮助。


2
需要在cpp文件中(或者一般的定义中)使用JSONDeserializer ::。否则,您将得到未定义的引用。 https://coliru.stacked-crooked.com/a/8f8a0cd3f9db6c94 https://coliru.stacked-crooked.com/a/6cd1efe94c09d521 - Zoe stands with Ukraine
2
哦,这就是我的问题所在。我在我的.h文件中使用了ClazzName::。糟糕。 - Marvo

5

当我的头文件缺少闭合括号时,我看到了这个错误。

导致此错误的原因是:

// Obj.h
class Obj {
public:
    Obj();

修复此错误:

// Obj.h
class Obj {
public:
    Obj();
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接