Error del compilador C3861
'identifier': no se encontró el identificador
El compilador no pudo resolver una referencia a un identificador, incluso con una búsqueda dependiente de argumentos.
Comentarios
Para corregir este error, compare el uso del identificador con la declaración de identificador para mayúsculas y minúsculas y ortografía. Compruebe que los operadores de resolución de ámbito y las directivas using
se han usado correctamente. Si el identificador se ha declarado en un archivo de encabezado, compruebe que el encabezado se haya incluido antes de que se haga referencia al identificador. Si el identificador está diseñado para ser visible externamente, asegúrese de que se declara en cualquier archivo de origen que lo use. Compruebe también que la declaración o la definición del identificador no haya sido excluida por las directivas de compilación condicional.
Los cambios para quitar funciones obsoletas de la biblioteca en tiempo de ejecución de C en Visual Studio 2015 pueden provocar la advertencia C3861. Para resolver este error, quite las referencias a estas funciones o reemplácelas por sus alternativas seguras, si las hubiera. Para obtener más información, vea Funciones obsoletas.
Si aparece el error C3861 después de la migración del proyecto desde versiones anteriores del compilador, es posible que tenga problemas relacionados con las versiones de Windows compatibles. Visual C++ ya no admite como destino Windows 95, Windows 98, Windows ME, Windows NT o Windows 2000. Si las macros WINVER
o _WIN32_WINNT
están asignadas a una de estas versiones de Windows, debe modificar las macros. Para obtener más información, vea Modificar WINVER
y _WIN32_WINNT
.
Ejemplos
Identificador no definido
El ejemplo siguiente genera un error C3861 porque no se ha definido el identificador.
// C3861.cpp
void f2(){}
int main() {
f(); // C3861
f2(); // OK
}
Identificador que no está en el ámbito
El ejemplo siguiente genera la advertencia C3861, porque un identificador solo está visible en el ámbito de archivo de su definición, a menos que se declare en otros archivos de origen que lo usen.
Archivo de origen 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
}
Archivo de origen C3861_a2.cpp
:
// C3861_a2.cpp
int f() { // declared and defined here
return 42;
}
Calificación de espacio de nombres necesaria
Las clases de excepción de la biblioteca estándar de C++ requieren el espacio de nombres de std
.
// 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;
}
}
Llamada a la función obsoleta
Las funciones obsoletas se han quitado de la biblioteca de 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 );
}
Funciones de ADL y friend
El ejemplo siguiente genera el error C3767 porque el compilador no puede usar la búsqueda dependiente del argumento para 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
}
Para corregir el error, declare el amigo en el ámbito de clase y defínalo en el ámbito del espacio de nombres:
class MyClass {
int m_private;
friend void func();
};
void func() {
MyClass s;
s.m_private = 0;
}
int main() {
func();
}