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

1
@altumano : 아니요,하지만 Cppcheck 는이를 수행 할 수 있으며 식별자에서 비 ASCII 문자를 감지하여 gcc에 더 쉽게 코드를 이식 할 수 있도록합니다.
sharptooth

@sharptooth : 감사합니다. Cppcheck는 실제로 이러한 오류를 감지 할 수 있습니다. 이 Cppcheck 심지어 비주얼 스튜디오 플러그인입니다 (하지만의 버그와 모든 파일에서 검색 할 수없는)
altumano

3
@altumano : 이건 github.com/VioletGiraffe/cppcheck-vs-addin 입니까? 만약 그렇다면 버그를보고 해 주시겠습니까? 그 프로젝트는 꽤 살아 있으며 수정 될 가능성이 높습니다.
sharptooth

안녕하세요. 미래입니다. - 이제 C4596 경고 가능하게하여, 이것에 대해 경고 MSVC를 강제 할 수 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
Zoe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.