5

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

我读过“LNK2022:元数据操作失败”让我发疯——这不是我的情况,因为在我的情况下,我无法编译一个项目——它在链接时失败。我尝试了该主题的所有(两个)解决方案,但这对我没有帮助。

就在我将类更改为模板类时,此错误开始出现。我有 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)。

这两类错误。

简而言之:Vector2D 打算成为 C++ 值类型类 vector2d(也是模板)的包装 .NET 类。我必须将所有功能重定向到包装类,所以我需要存储它的值,但是因为我在 ref 类中不能有非托管的 valuetype 变量(编译错误出现),我在该 valuetype 上使用了一个指针,但是这个指针应该被分配和在某处释放,并且我设计了 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,并且我在 stdafx.h 中包含了所有基本类型(如 Vector2D);然后每个简单的文件都包含 stdafx.h 并使用这些类型。

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

4

1 回答 1

0

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

于 2012-12-07T10:41:59.387 回答