我正在尝试从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);
}
您有调用CreateDirectory
的代码。当定义UNICODE
时,该符号实际上是CreateDirectoryW
的宏;当你也使用TCHAR
而不是char
或wchar_t
时,目的是让你使用"模棱两可"的函数名,所以你可以在编译Unicode或Ansi程序之间切换。
std::string
不随UNICODE
变化;它总是 Ansi,所以它的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接受宽字符,如果您使用Unicode模式则可以。您可能应该使用CreateDirectory或CreateDirectoryA。