Поделиться через


Ошибка компилятора 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();
}