gpt4 book ai didi

c++ - LNK2022:元数据操作失败:重复类型中的字段声明不一致

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:04 25 4
gpt4 key购买 nike

我在编译 C++ .NET 项目时遇到问题。

我已阅读 "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)。

错误 LNK2022:元数据操作失败 (8013118B):在重复类型中实现的接口(interface)不一致(类型:NativeValue >;接口(interface):System.IDisposable):(0x09000005)。

这两种类型的错误。

简而言之:Vector2D 打算成为 C++ 值类型类 vector2d(也是模板)的包装 .NET 类。我必须将所有功能重定向到包装类,所以我需要存储它的值,但是因为我不能在 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 文件移动到 header 时,它编译正常——这很奇怪。

我有预编译的头文件 stdafx.cpp,我在 stdafx.h 中包含了所有基本类型(如 Vector2D);然后每个简单的文件都包含 stdafx.h 并使用这些类型。

请,如果您发现任何可能的错误 - 请告诉我。谢谢。

最佳答案

您应该将模板定义和声明都放在头文件中。请引用this , 它解释了它是如何工作的。

关于c++ - LNK2022:元数据操作失败:重复类型中的字段声明不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2865021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com