2010-05-19 12 views
5

Tengo un problema con la compilación de mi proyecto C++ .NET.LNK2022: operación de metadatos fallida: declaraciones de campo inconsistentes en tipos duplicados

He leído "LNK2022: metadata operation failed" driving me insane - y este no es mi caso, porque en mi caso no puedo compilar un solo proyecto, falla en el momento del enlace. Probé las (dos) soluciones de ese tema y eso no me ayudó.

Estos errores comenzaron a aumentar justo cuando he cambiado la clase para que sea una clase de plantilla. tengo clase Vector2Di (para el tipo int) y ahora necesito completamente el mismo para el tipo flotador, así que le cambió el nombre a Vector2D y lo cambió a utilizar la plantilla, ahora tengo:

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

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

y comenzó a apear errores de enlace :

error LNK2022: operación de metadatos falló (80131188): incoherentes declaraciones de campos de tipos duplicados (tipos: NativeValue>; campos: m_NativeValue): (0x04000058).

y

LNK2022 de error: operación de metadatos falló (8013118B): inconsistente implementa las interfaces de tipos duplicados (tipos: NativeValue>; interfaces: System.IDisposable): (0x09000005).

estos dos tipos de errores.

En resumen: Vector2D tiene la intención de ser una clase .NET de ajuste para C++ valuetype class vector2d (que también es una plantilla). Tengo que redirigir todas las funcionalidades a la clase envolvente, así que necesito una tienda con su valor, PERO como no puedo tener una variable de tipo value sin gestionar en ref clase (compila errores apears), utilizo un puntero en ese tipo de valor, PERO este puntero debe asignarse y desasignado en alguna parte, Y diseñé ref clase NativeValue - también es una plantilla, almacena el tipo de valor como referencia y se encarga de eliminarlo a tiempo.

Es aquí:

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

Además, otra cosa extraña ahora aparece. Compila OK cuando muevo mi uso de estos tipos de archivos cpp a encabezados, es extraño.

tengo el encabezado precompilado stdafx.cpp, e incluyo todos los tipos básicos (como Vector2D) en stdafx.h; luego, cada archivo simple incluye stdafx.h y usa estos tipos.

Por favor, si ve algo posiblemente incorrecto, dígame. Gracias.

Respuesta

0

Debe colocar la definición y la declaración de la plantilla dentro del archivo de encabezado. Consulte this, explique cómo funciona.

Cuestiones relacionadas