LNK2022: сбой операции с метаданными: несогласованные объявления полей в дублированных типах - PullRequest
5 голосов
/ 19 мая 2010

У меня проблема с компиляцией проекта 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 и использует эти типы.

Пожалуйста, если вы видите что-то, возможно, не так - скажите мне. Спасибо.

1 Ответ

0 голосов
/ 07 декабря 2012

Вы должны поместить определение шаблона и объявление в заголовочный файл. Пожалуйста, обратитесь к этому , это объясняет, как это работает.

...