标准C++在QT创建者中不编译

标准C++在QT创建者中不编译,c++,string,qt,C++,String,Qt,目前我正在Qt创建者中使用MingW32 G++编译器 我已经将代码块中的工作代码移植到Qt中,以便使用Qt的网络功能,但当我移植代码时,它无法编译,错误如下: C:\software\Qt\AutoUpload\main.cpp:90: error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'LPCWSTR {aka const wchar_t*}' for ar

目前我正在Qt创建者中使用MingW32 G++编译器

我已经将代码块中的工作代码移植到Qt中,以便使用Qt的网络功能,但当我移植代码时,它无法编译,错误如下:

C:\software\Qt\AutoUpload\main.cpp:90: error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'LPCWSTR {aka const wchar_t*}' for argument '1' to 'void* FindFirstFileW(LPCWSTR, LPWIN32_FIND_DATAW)'
 HANDLE handle = FindFirstFile(dir, &search_data);
给出此错误的代码段是第8行:

1 vector<string> getFilesInDir(string directory)
2 {
3     vector<string> filenames;
4     string dir = string(directory + "\\*");
5 
6     WIN32_FIND_DATA search_data;
7     memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
8     HANDLE handle = FindFirstFile(dir.c_str(), &search_data);
9     while (handle != INVALID_HANDLE_VALUE)
10    {
11        if (FindNextFile(handle, &search_data) == FALSE) break;
12        if (search_data.cFileName == string(".") || search_data.cFileName == string(".."))
13        {
14            cout << "Ignoring..." << endl;
15            continue;
16        }
17        filenames.push_back(search_data.cFileName);
18        cout << search_data.cFileName << endl;
19    }
20
21    FindClose(handle);
22    return filenames;
23 }
其他问题,如找到的问题,并指出这是Windows API用于LPCWSTR类型的Unicode编码的一些问题,但此答案不完整或不正确。我对CodeBlocks和Qt Creator的编码设置都是UTF-8,而不是Unicode或任何其他编码方法

如果这是一个Unicode问题,则该代码不会在Visual Studio或代码块中编译,但无论如何。它编译得不完美的唯一环境是在Qt中


Qt Creator在做什么,突然使代码失去功能?

在Windows API中使用字符串的所有函数实际上都是宏

如果您查看的底部,您将看到有两个函数,FindFirstFileW和FindFirstFileA。使用哪一个取决于UNICODE宏,如果未定义,则使用ANSI函数FindFirstFileA,否则使用宽字符版本FindFirstFileW


如果定义了UNICODE,则需要使用字符串类的宽字符版本,例如std::wstring。

错误消息与显示的代码不匹配。请参阅第二个答案。是的。我在示例中手动添加了行号,以便可以轻松指出发生错误的行。第8行根据代码段。完整代码库中的第90行也许您应该在评论之前阅读问题。我的意思是,在错误消息中,您将std::string object dir作为第一个参数传递,但在代码中您使用dir.c_str。虽然使用dir.c_str可能会给您带来错误,但它不会是您所询问的相同错误。另外,请不要添加行号,而是在错误所在的行上添加注释。编译此问题中的代码时不会出现错误消息!消息本身包含错误的代码,显然,它与您提供的代码不匹配。因此,这个问题具有误导性。请编辑它以发布实际的错误消息。所以我的解决方案是直接将未定义的UNICODE添加到文件的顶部?这是一个比任何其他问题都想用的迂回解决方案更有用的答案。@Kats这实际上取决于代码的其余部分。UNICODE宏由项目设置中的一个标志控制,但我不知道具体在哪里。添加undef UNICODE确实有效,并允许代码按预期编译和运行。为什么这是Qt Creator中的一个必要步骤,而其他IDE都不强制执行它?@Kats这可能是为了使Qt Creator与Visual Studio和VC++编译器兼容。事实上,这是Windows API编程的一大难题,使其即使在同一平台上也不可移植。@Kats CodeBlocks已将构建设置为默认窄字符串-这不是MingW的工作,与Qt无关。所有现代Windows代码都定义了UNICODE。您的代码一开始就被破坏了,因为您在设计它时假设没有定义UNICODE。在如何使用代码编写可移植的现代WINAPI方面,CodeBlocks本质上误导了您。这是异常值。当您假定定义了UNICODE时,您的代码将使用本机Visual Studio项目、qmake项目和cmake项目中的默认设置干净地编译。