4

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

3 回答 3

5

您有调用CreateDirectory. 定义时UNICODE,该符号实际上是 ; 的宏CreateDirectoryW。目的是让您在使用TCHAR而不是charor时使用“模棱两可”的函数名称wchar_t,这样您就可以在为 Unicode 或 Ansi 程序编译之间切换。

但是,std::string不会根据UNICODE; 它总是Ansi,所以它的c_str方法总是返回 a char*,从不wchar_t*。当您有一个始终为 Ansi 的参数时,您也应该显式调用始终为 Ansi 的函数。在这种情况下,调用CreateDirectoryA.

您也可以考虑使用std::basic_string<TCHAR>,但这可能会朝着您不希望的方向前进。

一个快速的解决方法是调整您的项目设置,以便UNICODE不再定义。请查阅工具集的文档以了解如何执行此操作,或探索 IDE 的项目选项。

于 2013-05-15T02:17:03.210 回答
5

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

要创建一个宽字符串,您可以L在常规字符串之前添加。

CreateDirectory(L"mydir", NULL);

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

于 2013-05-15T01:53:40.303 回答
3

CreateDirectoryW 接受宽字符,如果您使用 Unicode 模式就可以了。您可能应该使用 CreateDirectory 或 CreateDirectoryA。

于 2013-05-15T01:51:59.753 回答