标准C++在QT创建者中不编译
目前我正在Qt创建者中使用MingW32 G++编译器 我已经将代码块中的工作代码移植到Qt中,以便使用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
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项目中的默认设置干净地编译。