C ++/CLI : 동일한 객체 클래스의 동일한 방법을 재정의하는 방법
-
11-09-2019 - |
문제
나는 C ++/CLI에 대한 초보자이며 기본 객체 클래스의 동일한 방법을 무시하려는 몇 가지 문제가 있습니다. 다음 코드에 대해 다음 컴파일 경고 오류가 발생합니다. 어떻게 수정해야합니까?
Warning 1 warning C4490: 'override' : incorrect use of override specifier; 'Test::Sample::Equal' does not match a base ref class method c:\project\code\Sample.h 18
Error 2 error LNK2022: metadata operation failed (80131187) : Inconsistent method declarations in duplicated types (types: Test.Sample; methods: Equal): (0x06000002). Sample.obj
편집 3 : "Equal"을 "Equals"로 변경하고 소스 파일에서 키워드를 제거했지만 오류 2는 여전히 서 있습니다.
// 헤더 파일
public ref class Sample : public Object
{
public:
int someVariable;
virtual bool Equals(Object^ obj) override;
virtual int GetHashCode() override;
}
// 소스 파일
bool Sample::Equals(Object^ obj)
{
if ( obj == nullptr || GetType() != obj->GetType() )
return false;
Sample^ p = dynamic_cast<Sample^>(obj);
return (someVariable == p->someVariable);
}
int Sample::GetHashCode()
{
return GetHashCode();
}
해결책
메소드의 이름은 아닙니다 Equal
, 그것의 Equals
. 사용해서는 안됩니다 virtual
또는 override
구현의 키워드 :
ref class Test {
public:
virtual bool Equals(Object^ o) override;
virtual int GetHashCode() override;
};
bool Test::Equals(Object^ o) { // no "override" here
//...
}
int Test::GetHashCode() { // no "override" here
//...
}
다른 팁
다음은 추출됩니다 여기:
MSDN에 따르면, LNK2022의 한 가지 이유는 구조물이 동일한 이름을 가진 여러 모듈에 존재하지만 충돌하는 정의와 /clr로 컴파일 할 때입니다. 이것은 일반적으로 컴파일러가 동일한 유형의 두 모듈에 약간 다른 메타 데이터를 넣기 때문에 발생합니다. 링크 시간에 메타 데이터가 병합되면이 오류는 유형의 이름이 동일하기 때문에 방출되지만 해당 유형을 설명하는 나머지 메타 데이터에는 약간의 여부가 있습니다.
제휴하지 않습니다 StackOverflow