5

C++ .NET プロジェクトのコンパイルに問題があります。

「LNK2022: メタデータ操作が失敗しました」を読んだことがありますが、これは私の場合ではありません。私の場合、1 つのプロジェクトをコンパイルできないためです。リンク時に失敗します。そのトピックのすべて (2 つ) のソリューションを試しましたが、役に立ちませんでした。

このエラーは、クラスをテンプレート クラスに変更した直後に発生し始めました。私は Vector2Di (int 型の場合) クラスを持っていて、float 型の場合も完全に同じ必要があるため、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)。

この2種類のエラー。

簡単に説明すると、Vector2D は、C++ 値型クラス vector2d (テンプレートでもある) のラッピング .NET クラスになる予定です。すべての機能をラッパー クラスにリダイレクトする必要があるため、その値を保存する必要がありますが、ref クラスに管理されていない valuetype 変数を含めることができないため (コンパイル エラーが表示されます)、その valuetype でポインターを使用しますが、このポインターを割り当てる必要があります。どこかで割り当てを解除し、ref クラス NativeValue を設計しました。これもテンプレートであり、valuetype を参照として保存し、時間内に削除するようにします。

ここです:

    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 をプリコンパイルし、stdafx.h にすべての基本型 (Vector2D など) を含めます。次に、すべてのファイルに単純に stdafx.h をインクルードし、これらのタイプを使用します。

何か間違っている可能性がある場合は、教えてください。ありがとうございました。

4

1 に答える 1

0

テンプレートの定義と宣言の両方をヘッダーファイル内に配置する必要があります。これを参照してください、それはそれがどのように機能するかを説明しています。

于 2012-12-07T10:41:59.387 に答える