我正在尝试从openCV 2.4.5到Visual Studio 2010(基于VC ++)的示例代码bagofwords_classification.cpp。但是我找到了错误代码:
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);
}
答案 0 :(得分:5)
CreateDirectory
将被定义为CreateDirectoryW
,期望其参数为“宽”字符串(UTF-16编码WCHAR*
)。
要创建一个宽字符串,您可以将L
添加到常规字符串中。
CreateDirectory(L"mydir", NULL);
或者,您可以在属性中将项目切换为多字节编码。这意味着调用CreateDirectory
将自动使用接受CreateDirectoryA
字符串的函数的char*
版本。这些应该是活动代码页的多字节编码。
答案 1 :(得分:5)
您的代码调用CreateDirectory
。定义UNICODE
时,该符号实际上是CreateDirectoryW
的宏;当您还使用TCHAR
而不是char
或wchar_t
时,您的意图是使用“模糊”函数名称,因此您可以在编译Unicode或Ansi程序之间切换。 / p>
但是,std::string
根据UNICODE
不会改变;它始终是 Ansi,因此其c_str
方法始终返回char*
,而不是wchar_t*
。当你有一个始终是Ansi的参数时,你应该显式地调用始终是Ansi的函数。在这种情况下,请致电CreateDirectoryA
。
您也可以考虑使用std::basic_string<TCHAR>
,但这可能会朝着您不想去的方向前进。
快速解决方法是调整项目设置,以便不再定义UNICODE
。请参阅工具集的文档以了解如何执行此操作,或浏览IDE的项目选项。
答案 2 :(得分:3)
CreateDirectoryW接受宽字符,如果您使用的是Unicode模式,则可以。您可能应该使用CreateDirectory或CreateDirectoryA。