'CreateDirectoryW':无法在OpenCV 2.4.5和VS 2010中将参数1从'const char*'转换为'LPCWSTR'

Dom*_*lly 4 c++ opencv sample classification

我正在尝试从openCV 2.4.5到Visual Studio 2010(基于VC++)的示例代码bagofwords_classification.cpp.但是我找到了错误代码:

error C2664: 'CreateDirectoryW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'   
Run Code Online (Sandbox Code Playgroud)

你能帮我解决一下这个问题吗?谢谢.:)

更新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);
}
Run Code Online (Sandbox Code Playgroud)

use*_*113 5

CreateDirectory将被定义为CreateDirectoryW期望其参数为"宽"字符串(UTF-16编码WCHAR*).

要创建一个宽字符串,您可以添加L到常规字符串.

CreateDirectory(L"mydir", NULL);
Run Code Online (Sandbox Code Playgroud)

或者,您可以在属性中将项目切换为多字节编码.这意味着调用CreateDirectory将自动使用CreateDirectoryA接受char*字符串的函数的版本.预计这些将在活动代码页的多字节编码中.


Rob*_*edy 5

你有调用的代码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的项目选项.