【问题标题】:variable has incomplete type std::string; string.h has many errors变量的类型不完整 std::string; string.h 有很多错误
【发布时间】:2019-05-22 19:07:29
【问题描述】:

字符串有些问题。我已经使用它们几个星期没有问题,但是在星期一的中途,我开始遇到奇怪的问题: [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;

也是不完整的类型

  • 预期结果:没有像过去几周那样的问题。我能够声明、初始化、追加()等等
  • 实际结果:无法编译/调试
  • 错误:variable has incomplete type 'std::string' variable has incomplete type 'std::wstring' no matching constructor for initialization of 'std::ostringstream'

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

编辑:基于this answer,它可能使用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\0008\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 中没有下划线,所以我不知道它有问题。这是有道理的,因为我注释掉了 &lt;string.h&gt;&lt;cstring&gt;#includestrlen() 是其中之一。

【问题讨论】:

  • &lt;string&gt; 是要使用的正确标头。如果您对是否应该编译某些东西有疑问,请尝试在像compiler explorer 这样的干净环境中编译有问题的代码。在这种情况下,您的设置似乎有问题。
  • 为了确保您使用正确的包含和 lib 路径,请通过“开始”菜单打开 Visual Studio 命令提示符:开始/Visual Studio 2015/Developer 命令提示符。从那里,检查 INCLUDE 和 LIB 路径;它们应该由 VC 位正确地放在前面。在该命令提示符下,键入 devenv 以启动 GUI,然后打开您的项目并重试。如果这不起作用,则项目本身可能具有覆盖以包含破坏您构建的路径,而上帝只知道您是如何管理的。
  • 还值得仔细检查您的项目属性(属性/VC++ 目录/常规/包含目录)并确保它没有丢失其继承的包含目录(系统是 $(VC_Include_Path) 或类似)
  • @Mansoor 很酷,感谢您的链接。我也怀疑这与我的设置有关。这就是我标记visual-studio的原因。我无法复制整个文件,因为它位于另一台机器上,但它似乎在该站点上运行良好。
  • @WhozCraig cool 不知道 VS 有一个完整的命令提示符,谢谢。 inspect 在命令提示符中无法识别,所以我不确定您所说的检查它们的路径或“VC 位”是什么意思。 devenv 有效,但项目仍有问题 @ChrisD 包含目录有 $(VC_Include_Path);$(WindowsSDK_IncludePath);

标签: c++ visual-studio stdstring


【解决方案1】:

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

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

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

【讨论】:

  • 对不起,代码在另一台没有互联网访问的机器上,所以我无法复制代码。双 argc 是我的错字。你知道我怎么能看到实际使用的是什么编译器吗?如果您不熟悉VS,我想不会。我没有使用命令行或任何东西。我只是在使用调试,所以我从不输入 g++ *.cpp 或类似的东西
  • 别担心!因此,当我提到不同的编译器时,这是为了回应您的说法,您会看到调用了不同的编译器,在这种情况下,您可能会看到特定于编译器的错误。例如,当我使用make 时,我看到屏幕上列出了不同的编译步骤。该步骤之后的任何错误,我都知道该错误与该步骤相关。你看到类似的东西吗?如果是这样,那将是要修复的编译器。
  • 我已将部分输出添加到主帖中。格式搞砸了,由于某种原因我无法编辑它,但它在那里
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2018-11-08
    相关资源
    最近更新 更多