Я пробовал пример кода bagofwords_classification.cpp из openCV 2.4.5 в Visual Studio 2010 (на основе VC ++). Но я нашел код ошибки:
error C2664: 'CreateDirectoryW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
Можете ли вы помочь мне решить эту проблему? Благодарю. 🙂
Обновление v1:
static void makeDir( const string& dir )
{
#if defined WIN32 || defined _WIN32
CreateDirectory( dir.c_str(), 0 );
#else
mkdir( dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH );
#endif
}
static void makeUsedDirs( const string& rootPath )
{
makeDir(rootPath + bowImageDescriptorsDir);
makeDir(rootPath + svmsDir);
makeDir(rootPath + plotsDir);
}
У вас есть код, который вызывает CreateDirectory
, когда UNICODE
определяется, что символ на самом деле является макросом для CreateDirectoryW
; цель состоит в том, чтобы вы использовали «неоднозначные» имена функций, когда вы также используете TCHAR
вместо char
или же wchar_t
, так что вы можете переключаться между компиляцией для программ Unicode или Ansi.
Тем не мение, std::string
не меняется в соответствии с UNICODE
; его всегда Анси, так что его c_str
метод всегда возвращает char*
, никогда wchar_t*
, Когда у вас есть параметр, который всегда является Ansi, вы должны явно вызывать функции, которые также всегда являются Ansi. В этом случае позвоните CreateDirectoryA
,
Вы также можете рассмотреть возможность использования std::basic_string<TCHAR>
, но это, вероятно, движется в направлении, которое вы не хотите идти.
Быстрое решение проблемы — настроить параметры проекта так, чтобы UNICODE
больше не определяется. Обратитесь к документации по вашему набору инструментов, чтобы узнать, как это сделать, или изучите варианты проекта вашей IDE.
CreateDirectory
будет определяться как CreateDirectoryW
который ожидает, что его параметры будут «широкими» строками (в кодировке UTF-16 WCHAR*
).
Для создания широкой строки вы можете добавить L
в обычную строку.
CreateDirectory(L"mydir", NULL);
В качестве альтернативы вы можете переключить свой проект на многобайтовую кодировку в свойствах. Это будет означать, что вызов CreateDirectory
будет автоматически использовать CreateDirectoryA
версия функции, которая принимает char*
строки. Ожидается, что они будут в многобайтовой кодировке активной кодовой страницы.
CreateDirectoryW принимает широкий символ, если вы используете режим Юникод, это нормально. Вы, вероятно, должны использовать CreateDirectory или CreateDirectoryA.