我是DirectX编程和Visual C ++的新手,将从xnamath.h找到的示例迁移到DirectXMath.h时遇到问题。我正在使用Visual Studio 2012。

该代码的目的仅是初始化XMMATRIX,然后将其显示在控制台中。原始代码如下所示(工作正常):

#include <windows.h>
#include <xnamath.h>
#include <iostream>
using namespace std;

ostream& operator<<(ostream& os, CXMMATRIX m)
{
    for(int i = 0; i < 4; ++i)
    {
        for(int j = 0; j < 4; ++j)
            os << m(i, j) << "\t";
        os << endl;
    }
    return os;
}

int main()
{
    XMMATRIX A(1.0f, 0.0f, 0.0f, 0.0f,
               0.0f, 2.0f, 0.0f, 0.0f,
               0.0f, 0.0f, 4.0f, 0.0f,
               1.0f, 2.0f, 3.0f, 1.0f);

    cout << "A = " << endl << A << endl;

    return 0;
}


当我运行程序时,它给出以下输出:

A =
1       0       0       0
0       2       0       0
0       0       4       0
1       2       3       1

Press any key to continue . . .


但是,当我将标头更改为DirectXMath时,它不再起作用:

#include <windows.h>
#include <iostream>
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
using namespace DirectX;
using namespace DirectX::PackedVector;
using namespace std;

ostream& operator<<(ostream& os, CXMMATRIX m)
{
    for(int i = 0; i < 4; ++i)
    {
        for(int j = 0; j < 4; ++j)
            os << m(i, j) << "\t";
        os << endl;
    }
    return os;
}

int main()
{
    XMMATRIX A(1.0f, 0.0f, 0.0f, 0.0f,
               0.0f, 2.0f, 0.0f, 0.0f,
               0.0f, 0.0f, 4.0f, 0.0f,
               1.0f, 2.0f, 3.0f, 1.0f);

    cout << "A = " << endl << A << endl;

    return 0;
}


当我尝试编译时,出现os << m(i, j) << "\t";错误,它表示:

error C2064: term does not evaluate to a function taking 2 arguments


当我将鼠标悬停在m(i, j)下的红色波浪线时,它告诉我:

DirectX::CXMMATRIX m
Error: call of an object of a class type without appropriate operator() or conversion function to pointer-to-function type


任何建议将不胜感激。

最佳答案

取决于您用于DirectXMath的版本,可以定义_XM_NO_INTRINSICS_以获得所需的结果。有关更多信息,请参见http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xmmatrix(v=vs.85).aspx

08-16 10:11