переменная имеет неполный тип std :: String;В string.h много ошибок - PullRequest
0 голосов
/ 22 мая 2019

что-то не так со строками. Я использовал их в течение нескольких недель без проблем, но в середине понедельника у меня начались странные проблемы: [Clang IntelliSense] Error: variable has incomplete type 'std::string' всякий раз, когда я пытаюсь сделать строку. аналогичные ошибки возникают, когда я пытаюсь wstring и ostringstream, но не 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 () проблематично

edit: на основе этого ответа , вероятно, он использует 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, поэтому я понятия не имел, что с ним возникла проблема. это имеет смысл, потому что я закомментировал #include для <string.h> и <cstring> и strlen () в одном из них.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

удалось избежать этой проблемы, но, вероятно, не решить все еще неизвестную основную проблему, удалив неиспользуемую библиотеку из моего списка каталогов и затем перезагрузив все каталоги . Я не уверен, что что-то было решено, потому что перезагрузка каталогов дает случайные результаты. иногда это решает проблемы, а иногда вызывает новые. Буквально вчера я перезагружался и тогда не смог найти system.h и time.h (не помню имен). Я устранял это, но проблема исчезла через несколько часов. тем не мение Я разместил следующий вопрос здесь

0 голосов
/ 22 мая 2019

Если вы скопировали свой код именно из того, что у вас есть, я вижу два объявления argc в вашем определении main. Ваш компилятор определенно должен выдавать ошибки об этом. Возможно, ваш компилятор задерживает ошибку чтения до тех пор, пока вы не объявите std::string в main? (У меня был компилятор, выдававший ошибку через несколько строк после фактической ошибки для чего-то, казалось бы, не связанного.) Итак, вы, возможно, исправили ошибку, указав неверный путь к файлу, но, возможно, неправильное определение main отбрасывает компилятор .

Теперь, если это не сработало, вы упомянули о том, что использовали несколько компиляторов. Если вы видите, что конкретный компилятор выдает эту ошибку, возможно, вы захотите отдельно обновить указанный компилятор. Функциональные возможности компиляторов являются модульными, поэтому вы можете выбрать, какой компилятор вы используете для какого этапа компиляции. VS, вероятно, делает это, чтобы получить лучший результат. Иногда компиляторы несут с собой файлы, которые они хотят использовать, таким образом, обновляя (или даже удаляя / переустанавливая) компилятор должен исправить файлы, которые он несет с собой. (Windows любит делать все за вас, поэтому вы можете что-то испортить, если попытаетесь обновить детали по отдельности. В любом случае, это всегда было моим опытом. Но я не использовал Windows более года, так что это может изменились.)

Если это не помогло, возможно, вам придется удалить / переустановить VS. Я признаю, что ничего не знал о VS, так как я использую Emacs для редактирования и Makefile / g ++ для компиляции. Однако я предполагаю, что VS может нести все необходимые ему компиляторы и файлы, поэтому обновление или удаление / переустановка (надеюсь) исправят вашу проблему.

...