4

私は C++/CLI の初心者であり、基本 Object クラスの Equal メソッドをオーバーライドしようとして問題が発生しています。次のコードに対して、次のコンパイル警告エラーが発生します。これはどのように修正する必要がありますか?

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();
}
4

2 に答える 2

7

メソッドの名前は ではなくEqualEqualsです。virtual実装でoroverrideキーワードを使用しないでください。

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
    //...
}
于 2009-12-02T09:27:06.990 に答える
0

以下はここから抽出されます:

MSDN によると、LNK2022 の 1 つの理由は、構造体が同じ名前の複数のモジュールに存在するが、定義が競合している場合、および /clr でコンパイルする場合です。これは通常、コンパイラが同じ型の 2 つのモジュールにわずかに異なるメタデータを配置するために発生します。リンク時にメタデータがマージされると、タイプの名前が同じであるため、このエラーが発生しますが、そのタイプを記述する残りのメタデータには矛盾があります。

于 2009-12-02T13:08:31.763 に答える