4

Je suis novice en C++/CLI et rencontre des problèmes pour tenter de surcharger la méthode Equal de la classe Object de base. Je reçois l'erreur d'avertissement de compilation suivante pour le code suivant. Comment cela devrait-il être corrigé?C++/CLI: comment redéfinir la méthode Equal de la classe Object

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 

Edit 3: J'ai changé "égal" à "Equals", mot-clé override supprimé dans le fichier source, mais l'erreur 2 est toujours debout.

// tête de fichier

public ref class Sample : public Object 
{ 
    public: 
     int someVariable; 

    virtual bool Equals(Object^ obj) override; 
    virtual int GetHashCode() override; 
} 

// Fichier source

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

La mise en œuvre de GetHashCode devrait utiliser les mêmes variables que vous utilisez dans votre implémentation Equals, tels que: int Sample::GetHashCode() { return someVariable->GetHashCode(); }

Répondre

5

Le nom de la méthode n'est pas Equal, il est Equals. Vous ne devriez pas utiliser virtual ou override mots-clés dans la mise en œuvre:

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 
    //... 
} 
+0

j'ai changé et égal à Equals retiré override à partir du fichier source, mais l'erreur 2 apparaît toujours. –

+0

Votre implémentation 'GetHashCode' est' FgStatusWrapper :: GetHashCode' alors que la déclaration est 'Sample :: GetHashCode'. –

+0

Je l'ai modifié en Sample mais l'erreur apparaît toujours. –

0

Ce qui suit est extrait de here:

Selon le MSDN, l'une des raisons pour LNK2022 est quand un struct existe dans plusieurs modules avec le même nom, mais avec des définitions conflictuelles, et lorsque vous compilez avec/clr. Cela arrive généralement parce que le compilateur met en quelque sorte des métadonnées légèrement différentes dans deux modules pour le même type. Au moment de la liaison, lorsque les métadonnées sont fusionnées, cette erreur est émise car le nom du type est le même, mais il y a une certaine différence dans le reste des métadonnées décrivant ce type.