C ++での余分な修飾エラー


120

次のように定義されたメンバー関数があります。

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

ソースをコンパイルすると、次のようになります。

エラー:メンバー 'ParseValue'の追加の修飾 'JSONDeserializer ::'

これは何ですか?このエラーを削除するにはどうすればよいですか?

回答:


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 2015年

1
@altumano:いいえ、ただしCppcheckはそれを行うことができ、gccへのコードの移植性を維持するのに役立つ識別子内の非ASCII文字も検出できます。
シャープトゥース、2015年

@sharptooth:ありがとう、Cppcheckは確かにそれらのエラーを検出できます。Cppcheck用のVisual Studioプラグインもあります(ただし、バグが多く、すべてのファイルで検出されません)
altumano

3
@altumano:これはgithub.com/VioletGiraffe/cppcheck-vs-addinですか?もしそうなら、あなたはバグを報告してください-そのプロジェクトはかなり生きており、修正される可能性は十分あります。
シャープトゥース2015年

未来からこんにちは。-あなたは今、C4596警告有効にすることによって、このことについて警告するMSVCを強制することができdocs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/...。コンパイラスイッチ/ we4596
Len

19

これは、クラスがクラス関数で重複して言及されていることを意味します。削除してみてくださいJSONDeserializer::


13

この行クラス宣言の中に入れていますか?その場合は、を削除する必要があり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
Zoe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.