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

时间:2013-05-15 01:46:31

标签: c++ opencv classification sample

我正在尝试从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);
}

3 个答案:

答案 0 :(得分:5)

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

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

CreateDirectory(L"mydir", NULL);

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

答案 1 :(得分:5)

您的代码调用CreateDirectory。定义UNICODE时,该符号实际上是CreateDirectoryW的宏;当您还使用TCHAR而不是charwchar_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。