Condividi tramite


Errore del compilatore C3861

'identifier': identificatore non trovato

Il compilatore non è riuscito a risolvere un riferimento a un identificatore, anche usando la ricerca dipendente dall'argomento.

Osservazioni:

Per correggere questo errore, confrontare l'uso dell'identificatore con la dichiarazione di identificatore per il caso e l'ortografia. Verificare che gli operatori di risoluzione dell'ambito e le direttive dello spazio dei nomi using vengano usati correttamente. Se l'identificatore viene dichiarato in un file di intestazione, verificare che l'intestazione sia inclusa prima che venga fatto riferimento all'identificatore. Se l'identificatore deve essere visibile esternamente, assicurarsi che sia dichiarato in qualsiasi file di origine che lo usi. Verificare anche che la dichiarazione o la definizione dell'identificatore non sia esclusa dalle direttive di compilazione condizionale.

Le modifiche per rimuovere le funzioni obsolete dalla libreria di runtime C in Visual Studio 2015 possono causare C3861. Per risolvere questo errore, rimuovere i riferimenti a queste funzioni o sostituirli con le relative alternative sicure, se presenti. Per altre informazioni, vedere Funzioni obsolete.

Se l'errore C3861 viene visualizzato dopo la migrazione del progetto da versioni precedenti del compilatore, potrebbero verificarsi problemi relativi alle versioni di Windows supportate. Visual C++ non supporta più i sistemi operativi Windows 95, Windows 98, Windows ME, Windows NT o Windows 2000. Se le WINVER macro o _WIN32_WINNT sono assegnate a una di queste versioni di Windows, è necessario modificare le macro. Per altre informazioni, vedere Modifica di WINVER e _WIN32_WINNT.

Esempi

Identificatore non definito

L'esempio seguente genera l'errore C3861 perché l'identificatore non è definito.

// C3861.cpp
void f2(){}
int main() {
   f();    // C3861
   f2();   // OK
}

Identificatore non incluso nell'ambito

L'esempio seguente genera l'errore C3861, perché un identificatore è visibile solo nell'ambito del file della relativa definizione, a meno che non sia dichiarato in altri file di origine che lo usano.

C3861_a1.cppFile di origine :

// 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.cppFile di origine :

// C3861_a2.cpp
int f() {  // declared and defined here
   return 42;
}

Qualificazione dello spazio dei nomi richiesta

Le classi di eccezioni nella libreria standard C++ richiedono lo spazio dei std nomi .

// 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;
   }
}

Funzione obsoleta denominata

Le funzioni obsolete sono state rimosse dalla libreria 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 );
}

Funzioni ADL e Friend

L'esempio seguente genera l'errore C3767 perché il compilatore non può usare la ricerca dipendente dell'argomento per 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
}

Per correggere l'errore, dichiarare friend nell'ambito della classe e definirlo nell'ambito dello spazio dei nomi:

class MyClass {
   int m_private;
   friend void func();
};

void func() {
   MyClass s;
   s.m_private = 0;
}

int main() {
   func();
}