다음과 같이 정의 된 멤버 함수가 있습니다.
Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString);
소스를 컴파일하면 다음과 같은 결과가 나타납니다.
오류 : 멤버 ‘ParseValue’에 대한 추가 자격 ‘JSONDeserializer ::’
이게 뭐야? 이 오류를 어떻게 제거합니까?
답변
다음 코드가 있기 때문입니다.
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
는 정규화 된 이름 (네임 스페이스 한정이있는 이름) 이라는 사실에서 발생 하며 이러한 이름은 클래스의 메서드 이름으로 금지됩니다.
답변
이것은 클래스가 클래스 함수로 중복 언급됨을 의미합니다. 제거해보십시오JSONDeserializer::
답변
이 줄을 클래스 선언 안에 넣 습니까? 이 경우 JSONDeserializer::
.
답변
가독성 / 유지 보수에 대한 가치있는 참고 사항 :
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가 많은 클래스의 메서드를 구현할 때 정의를보고 누가 누구에게 속하는지 알 수 있습니다.