我在编译 C++ .NET 项目时遇到问题。
我读过了“LNK2022:元数据操作失败”让我发疯 https://stackoverflow.com/questions/810827/lnk2022-metadata-operation-failed-driving-me-insane——这不是我的情况,因为就我而言,我无法编译一个项目——它在链接时失败。我尝试了该主题的所有(两个)解决方案,但这对我没有帮助。
当我将类更改为模板类时,这个错误就开始出现。我有 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)。
and
错误 LNK2022:元数据操作失败 (8013118B):重复类型中实现的接口不一致(类型:NativeValue >;接口:System.IDisposable):(0x09000005)。
这两种类型的错误。
简而言之:Vector2D 旨在成为 C++ 值类型类 vector2d(也是模板)的包装 .NET 类。我必须将所有功能重定向到包装类,所以我需要存储它的值,但是因为我不能在 ref 类中拥有非托管 valuetype 变量(出现编译错误),所以我在该 valuetype 上使用一个指针,但是应该分配该指针并且在某处释放,并且我设计了引用类 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,并且在 stdafx.h 中包含了所有基本类型(如 Vector2D);那么每个简单的文件都包含 stdafx.h 并使用这些类型。
如果您发现任何可能错误的地方,请告诉我。
谢谢。