Ошибка компилятора C3861
"идентификатор": идентификатор не найден
Компилятору не удалось разрешить ссылку на идентификатор, даже используя поиск, зависящий от аргументов.
Замечания
Чтобы устранить эту ошибку, сравните использование идентификатора с объявлением идентификатора для регистра и орфографии. Убедитесь, что операторы разрешения областей и директивы пространства using
имен используются правильно. Если идентификатор объявлен в файле заголовка, убедитесь, что заголовок включен перед ссылкой на идентификатор. Если идентификатор должен быть внешним видимым, убедитесь, что он объявлен в любом исходном файле, который использует его. Кроме того, убедитесь, что объявление или определение идентификатора не исключается директивами условной компиляции.
Изменения для удаления устаревших функций из библиотеки среды выполнения 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.cpp
void f2(){}
int main() {
f(); // C3861
f2(); // OK
}
Идентификатор не в области
Следующий пример создает C3861, так как идентификатор отображается только в области определения файла, если он не объявлен в других исходных файлах, использующих его.
Исходный файл C3861_a1.cpp
:
// C3861_a1.cpp
// Compile with: cl /EHsc /W4 C3861_a1.cpp C3861_a2.cpp
#include <iostream>
// Uncomment the following line to fix:
// int f(); // declaration makes external function visible
int main() {
std::cout << f() << std::endl; // C3861
}
Исходный файл C3861_a2.cpp
:
// C3861_a2.cpp
int f() { // declared and defined here
return 42;
}
Требуется квалификация пространства имен
Для классов исключений в стандартной библиотеке std
C++ требуется пространство имен.
// C3861_b.cpp
// compile with: /EHsc
#include <iostream>
int main() {
try {
throw exception("Exception"); // C3861
// try the following line instead
// throw std::exception("Exception");
}
catch (...) {
std::cout << "caught an exception" << std::endl;
}
}
Устаревшая функция с именем
Устаревшие функции удалены из библиотеки CRT.
// C3861_c.cpp
#include <stdio.h>
int main() {
char line[21]; // room for 20 chars + '\0'
gets( line ); // C3861
// Use gets_s instead.
printf( "The line entered was: %s\n", line );
}
ADL и дружественные функции
Следующий пример приводит к возникновению ошибки C3767, так как компилятор не может использовать поиск зависимых аргументов:FriendFunc
namespace N {
class C {
friend void FriendFunc() {}
friend void AnotherFriendFunc(C* c) {}
};
}
int main() {
using namespace N;
FriendFunc(); // C3861 error
C* pC = new C();
AnotherFriendFunc(pC); // found via argument-dependent lookup
}
Чтобы устранить ошибку, объявите друга в области класса и определите его в области пространства имен:
class MyClass {
int m_private;
friend void func();
};
void func() {
MyClass s;
s.m_private = 0;
}
int main() {
func();
}