DirectXMath.h运算符歧义

时间:2015-08-13 11:00:48

标签: directx-11 directxmath

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

“错误C2593:'operator *'是不明确的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;
};

3 个答案:

答案 0 :(得分:0)

您的using namespace DirectX;文件中是否有.cpp?请确保在标题文件中或using namespace DirectX;之前没有#include <DirectXMath.h>

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

编辑:请确保您不要在同一个应用程序中同时包含XNAMath.hDirectXMath.h。您应该只使用DirectXMath.h

答案 1 :(得分: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黑客帮了我大忙。

我认为问题实际上是#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运算符+(const btSimdScalar&,const btSimdScalar&)'   1> c:\ users \ germain \ documents \ work \ pp \ physics \ src \ linearmath \ btmatrix3x3.h(858):注意:或'btMatrix3x3运算符+(const btMatrix3x3&,const btMatrix3x3&)'   1> c:\ users \ germain \ documents \ work \ pp \ physics \ src \ linearmath \ btvector3.h(765):注意:或'btVector3运算符+(const btVector3&,const btVector3&)'   1> c:\ users \ germain \ documents \ work \ pp \ physics \ src \ linearmath \ btscalar.h(323):注意:或'__m128运算符+(const __m128,const __m128)'   1> c:\ program files(x86)\ windows kits \ 8.1 \ include \ um \ directxmathvector.inl(13945):注意:或'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(用项目符号表示)是一种从那里不污染名称空间的方法,

答案 2 :(得分:-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