Visual studio идентификатор не найден
Компилятору не удалось разрешить ссылку на идентификатор даже при поиске с зависимостью от аргументов. The compiler was not able to resolve a reference to an identifier, even using argument-dependent lookup.
Примечания Remarks
Чтобы устранить эту ошибку, сравните использование идентификатор на написание и регистр объявления идентификатора. To fix this error, compare use of identifier to the identifier declaration for case and spelling. Убедитесь, что операторов разрешения области и пространство имен директив using используются правильно. Verify that scope resolution operators and namespace using directives are used correctly. Если идентификатор объявлен в файле заголовка, убедитесь, что заголовок включен до ссылки на идентификатор. If the identifier is declared in a header file, verify that the header is included before the identifier is referenced. Если идентификатор должен быть видимый извне, убедитесь, что он объявлен в все файлы исходного кода, который его использует. If the identifier is meant to be externally visible, make sure that it is declared in any source file that uses it. Также проверьте, что идентификатор объявления или определения не исключен с директивы условной компиляции. Also check that the identifier declaration or definition is not excluded by conditional compilation directives.
Изменения, чтобы удалить устаревшие функции из библиотеки времени выполнения C в Visual Studio 2015 может привести к C3861. Changes to remove obsolete functions from the C Runtime Library in Visual Studio 2015 can cause C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасных альтернатив, если таковые имеются. To resolve this error, remove references to these functions or replace them with their secure alternatives, if any. Дополнительные сведения см. в разделе устаревшие функции. For more information, see Obsolete Functions.
При появлении ошибки C3861 после миграции проекта из более старой версии компилятора, возможно, возникли проблемы, связанные с поддерживаемыми версиями Windows. If error C3861 appears after project migration from older versions of the compiler, you may have issues related to supported Windows versions. Visual C++ больше не поддерживает создание программ для Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000. Visual C++ no longer supports targeting Windows 95, Windows 98, Windows ME, Windows NT or Windows 2000. Если ваши макросы WINVER или _WIN32_WINNT предназначены для одной из этих версий Windows, необходимо изменить такие макросы. If your WINVER or _WIN32_WINNT macros are assigned to one of these versions of Windows, you must modify the macros. Дополнительные сведения см. в разделе изменение WINVER и _WIN32_WINNT. For more information, see Modifying WINVER and _WIN32_WINNT.
Примеры Examples
Неопределенный идентификатор Undefined identifier
Следующий пример приводит к возникновению ошибки C3861, так как идентификатор не определен. The following sample generates C3861 because the identifier is not defined.
Идентификатор не находится в области Identifier not in scope
Следующий пример приводит к возникновению ошибки C3861, так как идентификатор отображается в области видимости файла его определения, только в том случае, если она не объявлена в других исходных файлах, которые ее используют. The following sample generates C3861 because an identifier is only visible in the file scope of its definition, unless it is declared in other source files that use it.
Требуется квалификации пространства имен Namespace qualification required
Классы исключений в стандартной библиотеке C++ требует std пространства имен. Exception classes in the C++ Standard Library require the std namespace.
Устаревшие функции с именем Obsolete function called
Устаревшие функции были удалены из библиотеки CRT. Obsolete functions have been removed from the CRT library.
ADL и дружественные функции ADL and friend functions
В следующем примере возникает C3767, так как компилятор не может использовать поиск по аргументам для FriendFunc : The following sample generates C3767 because the compiler cannot use argument dependent lookup for FriendFunc :
Чтобы устранить эту ошибку, объявите friend в области видимости класса и определите его в области видимости пространства имен: To fix the error, declare the friend in class scope and define it in namespace scope:
У меня есть файл «HSlider.h», он использует «Draw.h», где я определил свои функции для их использования.
Но компилятор говорит, что я не определил их (идентификатор не найден). Я искал на форумах похожую ошибку, но это не помогло.
Я работаю в VS 2015 Communty.
ПРИМЕР ОШИБКИ:
Ошибка C3861 DrawGUIBox: идентификатор не найден
Try2 c: users lel Documents visual studio 2015 projects try2 try2 hslider.h 50
,
HSlider.h
Draw.h
Решение
Проблема не в вашем исходном коде. Проблема в том, что ваш файл решения Visual Studio (в указанной вами ссылке) поврежден. В файле решения есть ссылки на проект под названием Try2, но этот проект не существует в решении.
Откройте файл Help.sln с помощью notepad ++, и вы увидите строку
Это означает, что должен быть подпроект под названием Try2, но он не существует. В вашем архиве субпроект фактически называется «Помощь». Итак, измените строку на:
После этого просмотрите папки x64 в своем решении и удалите все оставшиеся файлы, относящиеся к Try2.
ИЛИ, создайте новое пустое решение и скопируйте исходные файлы .cpp и .h (только) по одному в новое решение.
(Существует также отдельная проблема, когда отсутствует файл Offsets.h, но я не могу с этим помочь.)
Другие решения
Я нашел ответ сам.
Проблема была в круговом включении.
И это произошло потому, что я определил свои классы в файле заголовка вместо файла .cpp.
После этого и правильного перемещения заголовков я исправил это за считанные минуты.
Использую библиотеку math.h и в ней для нахождения кубического корня есть функция cbrt(); Только вот при компиляции Visual Studio говорит: error C3861: cbrt: идентификатор не найден.
Как решать проблему?
2 ответа 2
Правильно он споткнулся. Потому что эта функция находиться в другом заголовчном файле – amp_math.h (пруф).
Не знаю, с чем связано отсутствие этой функции, но попробуйте вот так:
Вообще cbrt есть в С99 и в C++TR1, который, кажется, как раз вошел в C++11. Ну а упрекнуть vc++ в хорошей поддержке этого стандарта до сих пор довольно трудно
Компилятору не удалось разрешить ссылку на идентификатор даже при поиске с зависимостью от аргументов.
Комментарии
Чтобы устранить эту ошибку, сравните использование идентификатора с объявлением идентификатора для Регистра и проверки орфографии. Убедитесь, что операторы разрешения области и пространство имен, использующие директивы , используются правильно. Если идентификатор объявлен в файле заголовка, убедитесь, что заголовок включен перед ссылкой на идентификатор. Если идентификатор должен быть видимым извне, убедитесь, что он объявлен в любом исходном файле, который его использует. Также убедитесь, что объявление идентификатора или определение не исключены директивами условной компиляции.
изменения в удалении устаревших функций из библиотеки времени выполнения C в Visual Studio 2015 могут вызвать C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасными альтернативами, если они есть. Дополнительные сведения см. в разделе устаревшие функции.
если ошибка C3861 появляется после миграции проекта из предыдущих версий компилятора, могут возникнуть проблемы, связанные с поддерживаемыми версиями Windows. Visual C++ больше не поддерживает создание программ для Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000. Если ваши макросы WINVER или _WIN32_WINNT предназначены для одной из этих версий Windows, необходимо изменить такие макросы. Дополнительные сведения см. в разделе изменение winver и _WIN32_WINNT.
Примеры
Неопределенный идентификатор
Следующий пример приводит к возникновению ошибки C3861, поскольку идентификатор не определен.
Идентификатор не находится в области
Следующий пример приводит к возникновению ошибки C3861, поскольку идентификатор виден только в области файла его определения, если только он не объявлен в других исходных файлах, которые его используют.
Требуется квалификация пространства имен
Для std классов исключений в стандартной библиотеке C++ требуется пространство имен.
Вызвана устаревшая функция
Устаревшие функции были удалены из библиотеки CRT.
Функции ADL и Friend
Следующий пример приводит к возникновению ошибки C3767, так как компилятор не может использовать поиск с зависимостью от аргумента для FriendFunc :
Чтобы устранить эту ошибку, объявите дружественную команду в области класса и определите ее в области видимости пространства имен:
Компилятору не удается найти объявление идентификатора. Эта ошибка имеет несколько возможных причин. Наиболее распространенными причинами C2065 является то, что идентификатор не был объявлен, идентификатор написан неправильно, заголовок, где объявляется идентификатор, не включается в файл, или в идентификаторе отсутствует квалификатор области, например, cout вместо std::cout . Дополнительные сведения об объявлениях в C++ см. в разделе объявления и определения (c++).
Ниже приведены некоторые распространенные проблемы и более подробные решения.
Идентификатор не объявлен
Если идентификатор является переменной или именем функции, его необходимо объявить перед тем, как его можно будет использовать. Перед использованием функции в объявлении функции также должны быть включены типы его параметров. Если переменная объявлена с помощью auto , компилятор должен иметь возможность определить тип из его инициализатора.
Если идентификатор является членом класса или структуры или объявлен в пространстве имен, он должен уточняться именем класса или структуры или именем пространства имен при использовании вне структуры, класса или области пространства имен. Кроме того, пространство имен должно быть помещено в область с помощью using директивы, такой как using namespace std; , или имя члена должно быть помещено в область с помощью using объявления, такого как using std::string; . В противном случае неполное имя считается необъявленным идентификатором в текущей области.
Если идентификатор является тегом для определяемого пользователем типа, например, class или struct , тип тега должен быть объявлен до его использования. Например, объявление struct SomeStruct < /*. */ >; должно существовать, прежде чем можно будет объявить переменную SomeStruct myStruct; в коде.
Если идентификатор является псевдонимом типа, тип должен быть объявлен с помощью using объявления или typedef перед тем, как его можно будет использовать. Например, необходимо объявить using my_flags = std::ios_base::fmtflags; , прежде чем можно будет использовать my_flags в качестве псевдонима типа для std::ios_base::fmtflags .
Пример: идентификатор с ошибками
Эта ошибка обычно возникает, когда имя идентификатора написано неправильно или идентификатор использует неправильные прописные и строчные буквы. Имя в объявлении должно точно совпадать с именем, которое вы используете.
Пример. Использование неограниченного идентификатора
Эта ошибка может возникать, если идентификатор не является правильно заданной областью. Если вы видите C2065 при использовании cout , это является причиной. Если функции и операторы стандартной библиотеки C++ не полностью определены в пространстве имен или вы не std передали пространство имен в текущую область с помощью using директивы, компилятор не сможет их найти. Чтобы устранить эту проблему, необходимо либо полностью определить имена идентификаторов, либо указать пространство имен с помощью using директивы.
Этот пример не компилируется, поскольку cout и endl определены в std пространстве имен:
Идентификаторы, объявляемые внутри class типов, struct или enum class , также должны уточняться именем их включающей области при их использовании за пределами этой области.
Пример: предварительно скомпилированный заголовок не является первым
Этот пример не удается скомпилировать, поскольку cout и endl определены в < заголовке iostream >, который игнорируется, так как он включается перед предкомпилированным файлом заголовка. Чтобы выполнить сборку этого примера, создайте все три файла, а затем скомпилируйте файл stdafx. cpp, а затем скомпилируйте C2065_pch. cpp.
Пример: отсутствует заголовочный файл
Вы не включили заголовочный файл, объявляющий идентификатор. Убедитесь, что файл, содержащий объявление идентификатора, включен в каждый исходный файл, который его использует.
Другая возможная причина заключается в том, что при использовании списка инициализаторов не включается < заголовок initializer_list >.
эта ошибка может возникать в исходных файлах Windows классических приложений, если вы определяете VC_EXTRALEAN , WIN32_LEAN_AND_MEAN или WIN32_EXTRA_LEAN . Эти макросы препроцессора исключают некоторые файлы заголовков из Windows. h и afxv_w32. h для ускорения компиляции. Просмотрите Windows. h и afxv_w32. h, чтобы получить последние сведения о том, что исключено.
Пример: отсутствует закрывающая кавычка
Эта ошибка может возникать, если отсутствует закрывающая кавычка после строковой константы. Это простой способ запутывания компилятора. Обратите внимание, что пропущенная закрывающая кавычка может быть в нескольких строках перед сообщаемым расположением ошибки.
Пример. Использование итератора вне области действия цикла
Эта ошибка может возникать, если объявить переменную-итератор в for цикле, а затем попробовать использовать эту переменную итератора вне области for цикла. Компилятор включает параметр компилятора /Zc: forScope по умолчанию. Дополнительные сведения см. в разделе Поддержка итераторов отладки .
Пример: объявление удаленного препроцессора
Эта ошибка может возникать, если вы ссылаетесь на функцию или переменную, которая находится в коде, скомпилированном по условию, который не компилируется для текущей конфигурации. Это также может произойти при вызове функции в файле заголовка, который в настоящее время не поддерживается в среде сборки. Если определенные переменные или функции доступны только при определении конкретного макроса препроцессора, убедитесь, что код, вызывающий эти функции, может быть скомпилирован только при определении одного и того же макроса препроцессора. Эту ошибку легко выявить в интегрированной среде разработки, так как объявление функции недоступно, если требуемые макросы препроцессора не определены для текущей конфигурации сборки.
Это пример кода, который работает при сборке в отладке, но не в розницу:
Пример: сбой выведения типа C++/CLI
Эта ошибка может возникать при вызове универсальной функции, если аргумент предполагаемого типа не может быть выведен из используемых параметров. Дополнительные сведения см. в разделе универсальные функции (C++/CLI).
Пример: параметры атрибута C++/CLI
эта ошибка также может быть вызвана работой по согласованности компилятора, выполненной для Visual Studio 2005: проверка параметров для Visual C++ных атрибутов.
error C2039: 'cout': is not a member of 'std' (compiler internal)(256): note: see declaration of 'std' error C2065: 'cout': undeclared identifier error C2039: 'setprecision': is not a member of 'std' (compiler internal)(256): note: see declaration of 'std' error C3861: 'setprecision': identifier not found error C2039: 'cout': is not a member of 'std'
Почему компилятор не может найти std::cout или std::setprecision ?
Хорошо, все еще есть ошибки. @Thomas Я исправил заголовок iomanip, но не могу вставить весь текст, потому что из программы, потому что он превышает предел на 650 символов.
Также вы можете отключить предварительно скомпилированные заголовки. Они очень раздражают новичков и не дают большой экономии времени на сборку. Для больших проектов они могут сэкономить время на сборку.
Пожалуйста, прочтите минимальный воспроизводимый пример. Сократите свою программу до минимального количества кода, который воспроизводит вашу проблему. (Перед этим сделайте копию своей программы).
@KristaLittmann на самом деле люди пытаются вам помочь. Когда много людей комментируют, это может быть ошеломляющим, но если за вопрос проголосовали против или закрыли, разумно прислушаться к отзывам, чтобы вы могли улучшить свои будущие посты. Также не размещайте скриншоты кода. Разработчикам, пытающимся помочь вам, нужно скопировать и вставить код, чтобы попытаться запустить его, или отредактировать, чтобы написать ответ.
Я честно считаю, что этот вопрос был несправедливо отвергнут. Это то, что меня всегда раздражало. Как, черт возьми, от людей ожидать, что они будут редактировать свои посты и доводить их до нуля, когда за пост 8 человек проголосовали против? Где стимул?
Можно упомянуть конкретную версию компилятора Visual C++, которую вы используете. Помогает ли использование другого компилятора? Соответствует ли заголовок "pch.h" приведенному здесь примеру?
E_net4 the commentary remover
@YvetteColomb Спасибо, Иветт, что согласилась! Я чувствовал, что прямое голосование против без объяснения того, что именно я сделал не так, было очень противоречивым по сравнению с тем, что я пытаюсь достичь здесь. Я был очень открыт для отзывов в самом начале поста, но люди, которые мы все еще голосуем против, даже не давая мне возможности обновить вопрос.
@Blastfurnace вот чего мне не хватало! ха-ха! Благодарность!
Я пометил это как дубликат. Имя файла заголовка по умолчанию отличается в более новых версиях Visual Studio, но ответ тот же.
Хм, я не знал, что Microsoft изменила имя по умолчанию для своего предварительно скомпилированного заголовка. Моя вина.
У меня есть программа, в которой я инвертирую регистр введенной строки. Это код в моем файле .cpp, и я использую среду разработки Visual Studio C ++. Я не уверен, что мне нужно в файле заголовка или нужен ли он для работы.
Ошибка с моим вызовом функции swapCase. Main не видит swapCase по какой-то причине, в которой я не уверен.
Приветствуются любые другие советы по синтаксису или семантике.
Очень опасно использовать массив фиксированного размера для пользовательского ввода - если я введу 40 символов, программа может вылететь или того хуже. Вы должны сделать , и читать его как . name std::string getline(cin, name)
Добавьте эту строку перед основной функцией:
Это называется предварительным объявлением: компилятору необходимо знать прототип функции при компиляции вызова функции.
Значит, вызываемый должен быть выше вызывающего? Это весело! Это так давно и лениво со стороны разработчиков компилятора.
или вы можете просто переместить эту функцию целиком перед main в файле. Не беспокойтесь о том, что, казалось бы, самая важная функция (main) находится внизу файла. Это очень распространено в C или C ++.
Когда компилятор встречает вызов swapCase в main (), он не знает о функции swapCase, поэтому сообщает об ошибке. Вы можете либо переместить определение swapCase выше основного, либо объявить случай подкачки выше основного:
Кроме того, 32 в swapCase заставляют читателя задуматься и задуматься. Комментарий помогает! В этом контексте было бы проще написать
Конструкция в моих if-тестах - дело личного стиля. У тебя все было в порядке. Главное - это способ изменения name [i] - использование разницы между «a» и «A» делает более очевидным, что происходит, и никому не нужно задаваться вопросом, действительно ли «32» правильное.
Читайте также: