문제

나는 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로 컴파일 할 때입니다. 이것은 일반적으로 컴파일러가 동일한 유형의 두 모듈에 약간 다른 메타 데이터를 넣기 때문에 발생합니다. 링크 시간에 메타 데이터가 병합되면이 오류는 유형의 이름이 동일하기 때문에 방출되지만 해당 유형을 설명하는 나머지 메타 데이터에는 약간의 여부가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top