web-dev-qa-db-ja.com

C ++の追加の修飾エラー

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

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

ソースをコンパイルすると、次の結果が得られます。

エラー:メンバー 'ParseValue'の追加の資格 'JSONDeserializer ::'

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

102
prosseek

これは、次のコードがあるためです。

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が修飾名(名前空間修飾のある名前)であり、そのような名前がクラスのメソッド名として禁止されているという事実に起因しています。

188

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

18
joe_coolish

この行を入れていますかinsideクラス宣言ですか?その場合は、JSONDeserializer::を削除する必要があります。

13
Boaz Yaniv

読みやすさ/保守性に関する価値ある注意:

実装ファイル(* .cpp)の定義でJSONDeserializer::修飾子を保持できます。

クラス内宣言(他の人が述べたように)に修飾子がない限り、g ++/gccはNiceを再生します。

例:

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が多くのクラスのメソッドを実装する場合、定義を見るだけで、誰が誰に属しているかを知るのに役立ちます。

6
bunkerdive