Здесь есть несколько проблем, которые приводят к сбою вашего кода.
Во-первых, вы не можете использовать элемент XMVECTORI32
для предоставления параметра шаблона для XMVectorPermute
.Это не из-за разницы типов (то же самое происходит с XMVECTORU32
).Я считаю, что проблема заключается в том, что массив i
не объявлен как const
, и значение должно быть постоянным, чтобы использоваться в качестве параметра шаблона.В любом случае VS2017 отказывается компилировать код.
Во-вторых, вы не можете специализировать шаблонную функцию, не предоставив тело для этой функции.Это будет означать, что ваша вторая строка не завершена, и вам понадобится реализация, написанная вами для компиляции.
Это не значит, что вы SOL, хотя вам просто нужно изменить свой подход.Если параметры шаблона всегда постоянны (и, похоже, они должны быть в вашем коде), вы можете определить функцию, которая принимает два векторных параметра и указывает точные константы перестановки, которые будут использоваться для этой конкретной операции.
Примером этого является следующий код:
DirectX::XMVECTOR XMVectorPermuteXXY(DirectX::FXMVECTOR V1, DirectX::FXMVECTOR V2)
{
return DirectX::XMVectorPermute<DirectX::XM_PERMUTE_0X,
DirectX::XM_PERMUTE_0X,
DirectX::XM_PERMUTE_0Y,
DirectX::XM_PERMUTE_0W>(V1, V2);
}
Любые другие операции, которые необходимо указать (XYXY, ZZWW, YYWZ и т. Д.), Могут быть определены аналогичным образом,с функциями-обертками, которые определяют правильные параметры шаблона.
Второй вариант - использовать не шаблонную версию XMVectorPermute
, которая принимает два вектора и четыре константы перестановки.Эта версия, вероятно, будет немного медленнее, но позволит вам указать константы перестановки во время выполнения.
Этот код выглядит следующим образом:
XMVECTOR XMVectorPermuteXXY(FXMVECTOR V1, FXMVECTOR V2)
{
return XMVectorPermute(V1, V2,
XM_PERMUTE_0X,
XM_PERMUTE_0X,
XM_PERMUTE_0Y,
XM_PERMUTE_0W);
}
На основе кода, который выпосле миграции вам нужно решить, какую версию вы планируете использовать.