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”,删除了源文件中的 override 关键字,但错误 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

方法的名称不是Equal,而是Equals。您不应该在实现中使用virtualoroverride关键字:

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 的一个原因是当结构存在于多个具有相同名称但定义冲突的模块中时,以及使用 /clr 编译时。这通常是因为编译器以某种方式将稍微不同的元数据放在相同类型的两个模块中。在链接时,当元数据合并时,会发出此错误,因为类型的名称相同,但描述该类型的其余元数据存在一些差异。

于 2009-12-02T13:08:31.763 回答