аргумент типа "const wchar t*" не совместим с параметром типа "WCHAR *" (aka "wchar_t *")

При написании кода выскакивает такая ошибка:

аргумент типа "const wchar t*" не совместим с параметром типа "WCHAR *" (aka "wchar_t *")

Код:

m_compileshaderfromfile(L"shader.fx", "VS", "vs_4_0", &pVSBlob);

Использую Microsoft Visual Studio 2022, кодировка стоит Unicode. Пробовал вот так:

Код:

const char* filenamestr = "shader.fx";
WCHAR filename[256];
MultiByteToWideChar(CP_UTF8, 0, filenamestr, -1, filename, sizeof(filename) / sizeof(WCHAR));
m_compileshaderfromfile(filename, "VS", "vs_4_0", &pVSBlob);

но тогда не компилируется shader.fx. Возможно не находит файл. В общем, возвращает 0. shader.fx лежит в папке с исполняемым файлом. Конфигурация Release. Объявление функции:

HRESULT m_compileshaderfromfile(WCHAR* FileName, LPCSTR EntryPoint, LPCSTR ShaderModel, ID3DBlob** ppBlobOut);

Скрин:

Code


Ответы (1 шт):

Автор решения: Harry

Как видите сами, функция описана как

HRESULT m_compileshaderfromfile(WCHAR* FileName, LPCSTR EntryPoint, LPCSTR ShaderModel, ID3DBlob** ppBlobOut);

Т.е. первый параметр — строка, содержимое которой может меняться (WCHAR* FileName), в то время как вы передаете строковый литерал, который изменяться не может.

Решение — создать такую изменяемую строку и передать, что вы и начали делать, но не довели до конца. Вот так будет логичнее:

WCHAR filename[256] = L"shader.fx";  

или использовать wcscpy для копирования.

С другой стороны, есть у меня подозрение, что эта строка реально никак не изменяется в функции (зачем бы менять переданное имя файла?!), что это просто недосмотр при проектировании... так что можно было бы использовать const_cast для приведения (именно для таких случаев const_cast и создавался). Но для этого нужна гарантия именно такого поведения функции. Если вы ее дать не в состоянии — лучше не используйте метод с приведением...

P.S. Как выяснилось из следующего вопроса, это ВАША функция. Тогда не морочьте голову, никаких кастов и переменных — просто объявляйте первый параметр как const WCHAR*!

→ Ссылка