2010-05-19 1 views
5

Ich habe Probleme beim Kompilieren meines C++ .NET-Projekts.LNK2022: Metadatenoperation fehlgeschlagen: Inkonsistente Felddeklarationen in duplizierten Typen

Ich habe gelesen "LNK2022: metadata operation failed" driving me insane - und das ist nicht mein Fall, denn in meinem Fall kann ich nicht ein einziges Projekt kompilieren - es schlägt bei der Verbindungszeit fehl. Ich habe versucht alle (zwei) Lösungen von diesem Thema und das hat mir nicht geholfen.

Dieser Fehler begann zu steigen, gerade wenn ich die Klasse zu einer Vorlagenklasse geändert habe. Ich habe Vector2Di (für int-Typ) Klasse und müssen nun vollständig das gleiche für Schwimmer-Typ, so dass ich benannte sie in Vector2D und verändert es Vorlage zu verwenden, jetzt habe ich:

template <class T> 
public ref class Vector2D : NativeValue<irr::core::vector2d<T>> 
{ 
... 
} 

typedef Vector2D<int> Vector2Di; 
typedef Vector2D<float> Vector2Df; 

Und es begann Linker Fehler apear :

Fehler LNK2022: Metadatenoperation fehlgeschlagen (80.131.188): inkonsistente Felddeklarationen in duplizierten Typen (Typen: NativeValue>; Felder: m_NativeValue): (0x04000058).

und

Fehler LNK2022: Metadatenoperation fehlgeschlagen (8013118B): inkonsistente implementierten Schnittstellen in duplizierten Typen (Typen: NativeValue>; Schnittstellen: System.IDisposable): (0x09000005).

diese zwei Arten von Fehlern.

Kurz gesagt: Vector2D soll eine Wrapping-.NET-Klasse für C++ - Value-Type-Klasse vector2d (was auch Vorlage ist) sein. Ich muss die gesamte Funktionalität um Wrapped-Klasse umleiten, so brauche ich einen Speicher seinen Wert, aber da ich nicht verwaltete Werttypvariable in Ref-Klasse haben kann (kompilieren Fehler apears), verwende ich einen Zeiger auf diesen Werttyp, aber dieser Zeiger sollte zugeordnet werden und irgendwo freigegeben, und ich entwarf Ref-Klasse NativeValue - es ist auch Vorlage, es speichert den Werttyp als Referenz und kümmert sich darum, es rechtzeitig zu löschen.

Es ist hier:

template <class T> 
    ref class NativeValue 
    { 
    public: 

     ~NativeValue() 
     { 
      this->!NativeValue(); 
     } 

     !NativeValue() 
     { 
      if (m_NativeValue != nullptr) 
      { 
       delete m_NativeValue; 
       m_NativeValue = nullptr; 
      } 
     } 

    internal: 

     T* m_NativeValue; 

    protected: 

     NativeValue() {} 
    }; 

Zusätzlich jetzt eine andere seltsame Sache kommt. Es kompiliert OK, wenn ich meine Verwendung dieser Typen von cpp-Dateien zu Kopfzeilen verschiebe - das ist seltsam.

Ich habe vorkompilierte Header stdafx.cpp, und ich schließe alle grundlegenden Typen (wie Vector2D) in stdafx.h; dann enthält jede einzelne Datei einfach stdafx.h und verwendet diese Typen.

Bitte, wenn Sie etwas möglicherweise falsch sehen - sagen Sie mir. Danke.

Antwort

0

Sie sollten die Vorlagendefinition und die Deklaration in die Header-Datei einfügen. Bitte beziehen Sie sich auf this, es erklärt, wie es funktioniert.

Verwandte Themen