У меня проблема с компиляцией проекта C ++ .NET.
Я прочитал «LNK2022: операция с метаданными не удалась», сводя меня с ума - и это не мой случай, потому что в моем случае я не могу скомпилировать один единственный проект - он терпит неудачу во время соединения. Я перепробовал все (два) решения из этой темы, и это мне не помогло.
Эти ошибки начали расти, как только я изменил класс на класс шаблона. У меня есть класс Vector2Di (для типа int), и теперь мне нужно абсолютно то же самое для типа с плавающей точкой, поэтому я переименовал его в Vector2D и изменил его на использование шаблона, теперь у меня есть:
template <class T>
public ref class Vector2D : NativeValue<irr::core::vector2d<T>>
{
...
}
typedef Vector2D<int> Vector2Di;
typedef Vector2D<float> Vector2Df;
И начали появляться ошибки компоновщика:
ошибка LNK2022: сбой операции метаданных (80131188): Несовместимые объявления полей в дублированных типах (типы: NativeValue>; поля: m_NativeValue): (0x04000058).
и
ошибка LNK2022: сбой операции метаданных (8013118B): Несовместимые реализованные интерфейсы в дублированных типах (типы: NativeValue>; интерфейсы: System.IDisposable): (0x09000005).
это два типа ошибок.
Вкратце: Vector2D намеревается быть обертывающим классом .NET для C ++ класса valuetspepe vector2d (который также является шаблоном). Я должен перенаправить все функциональные возможности в обернутый класс, поэтому мне нужно сохранить его значение, НО, поскольку я не могу иметь неуправляемую переменную valuetype в ref-классе (появляются ошибки компиляции), я использую указатель на этот тип значения, НО этот указатель должен быть выделен и где-то освобожден, и я разработал ref-класс NativeValue - это тоже шаблон, он хранит тип значения в качестве ссылки и вовремя удаляет его.
Это здесь:
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() {}
};
Кроме того, появилась еще одна странная вещь. Он компилируется нормально, когда я перемещаю свое использование этих типов из файлов cpp в заголовки - это странно.
У меня есть предварительно скомпилированный заголовок stdafx.cpp, и я включаю все основные типы (например, Vector2D) в stdafx.h; тогда каждый простой файл включает stdafx.h и использует эти типы.
Пожалуйста, если вы видите что-то, возможно, не так - скажите мне.
Спасибо.