【发布时间】:2019-02-15 05:02:17
【问题描述】:
我是 DirectX11 的新手,我正在尝试将使用 DirectX Legacy 编写的文件改编为新的 DirectX,但我在使用模板 XMVectorPermute 时遇到了一些问题,它曾经是 Legacy 文件中的一个函数。
我正在尝试让编译器识别DirectXMath.h 中的模板:
// General permute template
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
inline XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)
{
//...Definition
使用以下代码:
template DirectX::XMVECTOR DirectX::XMVectorPermute<PermuteXXY.i[0], PermuteXXY.i[1], PermuteXXY.i[2], PermuteXXY.i[3]>(FXMVECTOR V1, FXMVECTOR V2);
其中PermuteXXY定义为:
static CONST DirectX::XMVECTORI32 PermuteXXY =
{
DirectX::XM_PERMUTE_0X, DirectX::XM_PERMUTE_0X, DirectX::XM_PERMUTE_0Y, DirectX::XM_PERMUTE_0W
};
但编译器或链接器无法匹配: Error reported
XM_PERMUTE_...在DirectXMath.h中定义为const uint32_t,XMVECTORI32定义为联合:
union
{
int32_t i[4];
XMVECTOR v;
};
我不太擅长 c++ 模板,所以请尽可能彻底地帮助我。非常感谢!
【问题讨论】:
-
传递给模板版本的模板参数必须是编译时值,而不是变量。可能
constexpr可以在这里做一些有趣的事情,但我还没有尝试过,迄今为止DirectXMath 对 C++11/C++14/C++17 语言特性的使用相当少。如果您知道您的代码将始终使用相同的模式,请更改代码以使用新的模板版本。否则,使用参数版本。 -
顺便说一句,你读过porting guide吗?
-
谢谢!
constexpr确实有助于解决这种情况,程序现在可以通过编译。 @Chuck Walbourn
标签: c++ directx directx-11 directxmath