0

我最近写了一个矩阵类来处理 XMFloat4x4 和 XMVector 转换。它在 Windows 8 Metro 应用程序上运行良好,但是当我尝试将其移植到Win32 Windows 应用程序时,它开始出现错误

"error C2593: 'operator *' is ambiguous c:\program files (x86)\windows kits\8.1\include\um\DirectXMathMisc.inl",其中很多错误与多个重载实例有关函数 XMFunctions

包含“DirectXMath.h”时会出现问题

请让我知道出了什么问题

MATRIX4X4.h

#pragma once

#include <btBulletCollisionCommon.h>
#include <cmath>
#include <DirectXMath.h>

using namespace DirectX;
#define _USE_MATH_DEFINES

class MATRIX4X4
{
private:
    XMFLOAT4X4 _m;
public:
    MATRIX4X4();
    MATRIX4X4(const XMFLOAT4X4 &data);
    MATRIX4X4(float* data);

    void InitializeIdentity();
    MATRIX4X4& InitTranslation(float x, float y, float z);
    MATRIX4X4& InitTranslation(const XMFLOAT3 &pos);
    MATRIX4X4& InitScaling(float x, float y, float z);
    MATRIX4X4& InitScaling(const XMFLOAT3 &scl);
    MATRIX4X4& InitRotation(float x, float y, float z);
    MATRIX4X4& InitRotation(const XMVECTOR &quaternion);
    MATRIX4X4& InitPerspective(float minimumFieldOfView, float aspectRatio, float nearPlane, float farPlane);
    MATRIX4X4& InitOrthographic(float left, float right, float bottom, float top, float nearPlane, float farPlane);
    MATRIX4X4& InitView(const XMFLOAT3 &eyePosition, const XMFLOAT3 &lookPosition, const XMFLOAT3 &up);

    MATRIX4X4& SetTranslation(float x, float y, float z);
    MATRIX4X4& SetTranslation(const XMFLOAT3 &pos);
    MATRIX4X4& Translate(float dx, float dy, float dz);
    MATRIX4X4& Translate(const XMFLOAT3 &dp);

    MATRIX4X4& SetScale(float x, float y, float z);
    MATRIX4X4& SetScale(const XMFLOAT3 &scl);
    MATRIX4X4& Scale(float dx, float dy, float dz);
    MATRIX4X4& Scale(const XMFLOAT3 &ds);

    MATRIX4X4& SetRotation(float x, float y, float z);
    MATRIX4X4& SetRotation(const XMFLOAT3 &rot);
    MATRIX4X4& SetRotation(const XMVECTOR &quaternion);
    MATRIX4X4& Rotate(float dx, float dy, float dz);
    MATRIX4X4& Rotate(const XMFLOAT3 &dr);
    MATRIX4X4& Rotate(const XMVECTOR &quaternion);

    MATRIX4X4& operator* (MATRIX4X4 mat);
    MATRIX4X4& operator*= (MATRIX4X4 mat);

    void LookAt(const XMFLOAT3& position, const XMFLOAT3& target, const XMFLOAT3& up);

    // for bulllet physics //
    MATRIX4X4& Translate(const btVector3 &dp);
    MATRIX4X4& SetTranslation(const btVector3 &pos);
    MATRIX4X4& Scale(const btVector3 &ds);
    MATRIX4X4& SetScale(const btVector3 &scl);
    MATRIX4X4& Rotate(const btQuaternion &quaternion);
    MATRIX4X4& SetRotation(const btQuaternion &quaternion);
    /////////////////////////

    const XMFLOAT4X4& GetData() const;

    const XMFLOAT3& GetTranslation() const;
    const XMFLOAT3& GetScale() const;
    const XMVECTOR& GetRotation() const;
};
4

3 回答 3

0

繁荣:

#define BT_NO_SIMD_OPERATOR_OVERLOADS

(来自https://social.msdn.microsoft.com/Forums/sqlserver/en-US/5d85c350-f5cc-46c5-9924-0b07d1cd674e/directxmathh-operator-ambiguity?forum=windowssdk,我假设你得到了答案?: )我将把它留在这里以供参考,)

xm-no-intrinsics hack 为我解决了问题。

我认为问题实际上是#include <btBulletCollisionCommon.h>

我刚刚在我自己的项目中加入了子弹,我开始遇到同样的错误。我有#using namespace DirectX

您没有显示消息的其余部分,但对我来说,完整的错误是:

1>c:\users\germain\documents\work\pp\editor\camera\camera.h(27): 错误 C2593: 'operator +' 不明确 1> c:\users\germain\documents\work\pp\ physics\src\bulletdynamics\constraintsolver\btsolverbody.h(97): 注意:可能是 'btSimdScalar operator +(const btSimdScalar &,const btSimdScalar &)' 1> c:\users\germain\documents\work\pp\physics\ src\linearmath\btmatrix3x3.h(858): 注意:或'btMatrix3x3 operator +(const btMatrix3x3 &,const btMatrix3x3 &)' 1> c:\users\germain\documents\work\pp\physics\src\linearmath\btvector3 .h(765): 注意:或'btVector3 operator +(const btVector3 &,const btVector3 &)' 1> c:\users\germain\documents\work\pp\physics\src\linearmath\btscalar.h(323) : 注意: or '__m128 operator +(const __m128,const __m128)' 1> c:\program files (x86)\windows kits\8.1\include\um\directxmathvector.inl(13945): note: or 'DirectX::XMVECTOR DirectX::operator +(DirectX::FXMVECTOR,DirectX::FXMVECTOR)' 1> c:\users\germain\documents\work\pp\editor\camera\camera.h(27): 注意:在尝试匹配参数列表时 '(const DirectX::XMVECTOR, const DirectX::XMVECTOR)'

所以这似乎是有道理的。 #define BT_NO_SIMD_OPERATOR_OVERLOADS,在项目符号中,是不从那里污染你的命名空间的方法,

于 2018-08-29T23:04:04.657 回答
0

using namespace DirectX;.cpp文件里有吗?确保你没有using namespace DirectX;在一个头文件中或在你之前做#include <DirectXMath.h>.

您可能还想看看DirectX Tool Kit中的SimpleMath

编辑:确保您没有尝试将两者都包含XNAMath.hDirectXMath.h同一个应用程序中。你应该DirectXMath.h只使用。

于 2015-08-13T20:45:56.463 回答
-1

所以我只需要_XM_NO_INTRINSICS_在包含之前定义DirectXMath.h

#define _XM_NO_INTRINSICS_ 1;

欲了解更多信息:https ://msdn.microsoft.com/en-us/library/windows/desktop/ee415579(v=vs.85).aspx

于 2015-08-14T15:18:08.637 回答