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 をインクルードし、これらのタイプを使用します。
何か間違っている可能性がある場合は、教えてください。ありがとうございました。