变量的类型不完整 std::string; string.h 有很多错误

variable has incomplete type std::string; string.h has many errors

字符串出了点问题。我已经使用它们数周没有问题,但在星期一进行到一半时,我开始遇到奇怪的问题: [Clang IntelliSense] Error: variable has incomplete type 'std::string' 每当我尝试制作一个字符串时。当我尝试 wstringostringstream 而不是 stringstream 时,会出现类似的错误。 initializing std::string* s 也可以正常工作,但 s->append(...) 结果是 "member has access into incomplete type 'std::string'"

这一切都是因为 visual studio (VS) 突然无法找到我已经用了几个星期的 #includes ,包括一些标准库(不记得是哪个因为...)。我通过让 VS 搜索正确的文件解决了这个问题,它找到了一些文件(不确定它们是否与以前相同或不同)所以它不再有 #include 语句的问题但现在我遇到了这个问题.

我已经 <string.h> 好几个星期了。在研究这个问题时,我读到 <string.h> 是使用错误的文件,所以我尝试了 #include <string> 但没有区别。我已经尝试过 <strings.h><cstring> 但也没有区别。

我检查了我的外部依赖项,string.h 有几十个错误,我认为这很奇怪,因为它是我没有接触过的标准文件。

我正在使用 VS2015、GNU make,我看到了 Clang IntelliSense,但我在这里也看到了一些 g++,所以我不确定它实际使用的是什么编译器。还使用 visualGDB 5.3。如果我忘记了什么,请告诉我。

#include <iostream>
#include <string>
#include <sstream>
int main(int argc, char *argv[])
{
std::string message = "uncomment";
...
message

是突出显示有问题的部分(不完整类型)

std::wstring wideMessage;

也是不完整的类型

我在这里看到很多类似的问题,但所有问题都与前向声明有关,我看不出这与此有什么关系。我对 类、结构或函数没有任何问题;即使在 main() 中声明一个变量也是有问题的

编辑:基于,它可能使用VC++ 14.0 作为编译器,但我不知道如何确定

编辑 2:错误信息:

1>  VisualGDB: Sending 45 updated source files to build machine...
1>  VisualGDB: Run "make  CONFIG=Debug" in directory "/tmp/VisualGDB/c/Users/pthien/VS/Whatever/Whatever" on pthien@buildserver (SSH)
1>  /opt/poky/1.8/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++ -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8 --sysroot=/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi -ggdb -ffunction-sections -O0 -std=c++11 -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8 --sysroot=/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi -ggdb -ffunction-sections -O0 -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/include -I/opt/googletest-master/googletest/include -I/opt/boost_1_61_0 -I../../cereal/cereal-1.2.2/cereal-1.2.2/include -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/websocketpp-master -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/include/websocketpp -I/opt/curl-7.54.0 -I/opt/boost_1_61_0/boost -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/include/easywsclient-master -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/include/uWebSockets-master -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/include/c++/4.9.2/experimental -I/opt/boost_1_61_0/boost/tr1/tr1 -I/opt/boost_1_61_0/tools/build/src/engine -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/include/c++/4.9.2 -I/opt/curl-7.54.0/include -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/include/cereal -I/opt/poky/1.8/sysroots/x86_64-pokysdk-linux/usr/lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.9.2/include-fixed -I/opt/boost_1_61_0/boost/compatibility/cpp_c_headers -I"../../../../../Program -IFiles -I(x86)/Microsoft -IVisual -IStudio -I10.0/VC/crt/src" -I"../../../../../Program -IFiles -I(x86)/Microsoft -IVisual -IStudio -I14.0/VC/include" -I/opt/poky/1.8/sysroots/cortexa8hf-vfp-neon-poky-linux-gnueabi/usr/include/c++/4.9.2/arm-poky-linux-gnueabi -DDEBUG  -c Whatever.cpp -o Debug/Whatever.o -MD -MF Debug/Whatever.dep
1>  C:\Users\pthien\AppData\Local\VisualGDB\RemoteSourceCache\buildserver[=15=]08\include\wchar.h(459,20): note :    'wcstold'
1>   extern long double wcstold (const wchar_t *__restrict __nptr,
1>                      ^
1>  Whatever.cpp: In function 'int main(int, char**)':
1>C:\Users\pthien\VS\Whatever\Whatever\Whatever.cpp(138,47): error : 'strlen' was not declared in this scope
1>     size_t request_len = strlen(webSocketRequest);
1>                                                 ^
1>  Makefile:160: recipe for target 'Debug/Whatever.o' failed
1>  make: *** [Debug/Whatever.o] Error 1
1>  -------------------------------------------------------------
1>  Command exited with code 2
1>  Executable: make
1>  Arguments:  CONFIG=Debug
1>  Directory: /tmp/VisualGDB/c/Users/pthien/VS/Whatever/Whatever
1>VisualGDB : error : Command-line action failed
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.MakeFile.Targets(37,5): error MSB3073: The command ""C:\Program Files (x86)\Sysprogs\VisualGDB\VisualGDB.exe" /build "C:\Users\pthien\VS\Whatever\Whatever\Whatever.vcxproj" "/solution:C:\Users\pthien\VS\Whatever\Whatever.sln"  "/config:Debug" "/platform:Win32"" exited with code 1.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这大约是输出的 10%,包括开头和结尾。奇怪的是 strlen() 的问题。它在 IDE 中没有下划线,所以我不知道它有问题。这是有道理的,因为我为 <string.h><cstring> 注释掉了 #include,而 strlen() 是其中之一。

如果您完全复制现有的代码,我会在 main 的定义中看到两个 argc 的声明。你的编译器肯定会抛出错误。也许您的编译器会延迟读取错误,直到您在 main 中声明一个 std::string? (我有一个编译器在看似无关的实际错误之后几行抛出一个错误。)所以,你可能已经修复了文件路径错误的错误,但也许你对 main 的错误定义会抛出你的错误编译器关闭。

现在,如果这不起作用,您提到看到使用了一堆编译器。如果您看到某个特定的编译器抛出该错误,那么您可能需要单独更新该编译器。编译器的功能是模块化的,因此您可以选择在编译的哪一步使用哪个编译器。 VS 可能这样做是为了获得它认为最好的结果。有时编译器会携带他们想要使用的文件,因此更新(甚至 un/reinstalling)编译器应该修复它携带的文件。 (Windows 喜欢为你做所有事情,所以如果你尝试单独更新部分,你实际上可能会搞砸。无论如何,这一直是我的经验。但是,我没有使用 Windows一年多了,所以这可能已经改变了。)

如果仍然不能解决问题,您可能需要 un/reinstall VS。我承认我对 VS 一无所知,因为我使用 Emacs 进行编辑并使用 Makefile/g++ 进行编译。然而,我的猜测是 VS 可能会携带它需要的所有编译器和文件,因此更新或 un/reinstall 将(希望)解决您的问题。

设法避免了这个问题,但可能无法解决 still-unknown 根本问题,方法是从我的目录列表中删除一个未使用的库,然后 reloading all directories。我不相信任何事情都已解决,因为重新加载目录会产生随机结果。有时它会解决问题,有时会导致新问题。就在昨天,我重新加载,然后找不到 system.h 和 time.h (不记得名字了)。我正在对此进行故障排除,但几个小时后问题就消失了。反正 我发布了一个 follow-up 问题