Dela via


Kompilatorfel C3861

"identifierare": identifieraren hittades inte

Anmärkningar

Kompilatorn kunde inte matcha en referens till en identifierare, även med hjälp av argumentberoende sökning.

Du kan åtgärda det här felet genom att jämföra användningen av identifierare med identifierardeklarationen för skiftläge och stavning. Kontrollera att omfångsmatchningsoperatorer och namnområdesdirektivusing används korrekt. Om identifieraren deklareras i en rubrikfil kontrollerar du att rubriken inkluderas innan identifieraren refereras. Om identifieraren är avsedd att vara externt synlig kontrollerar du att den deklareras i alla källfiler som använder den. Kontrollera också att identifierardeklarationen eller definitionen inte undantas av villkorliga kompileringsdirektiv.

Ändringar för att ta bort föråldrade funktioner från C Runtime-biblioteket i Visual Studio 2015 kan orsaka C3861. Lös det här felet genom att ta bort referenser till dessa funktioner eller ersätta dem med eventuella säkra alternativ. Mer information finns i Föråldrade funktioner.

Om felet C3861 visas efter projektmigrering från äldre versioner av kompilatorn kan du ha problem som rör Windows-versioner som stöds. Visual C++ stöder inte längre mål för Windows 95, Windows 98, Windows ME, Windows NT eller Windows 2000. Om dina WINVER makron eller _WIN32_WINNT makron har tilldelats någon av dessa versioner av Windows måste du ändra makrona. Mer information finns i Ändra WINVER och _WIN32_WINNT.

Exempel

Odefinierad identifierare

I följande exempel genereras C3861 eftersom identifieraren inte har definierats.

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

Identifieraren är inte inom räckhåll

I följande exempel genereras C3861 eftersom en identifierare endast visas i filomfånget för dess definition, såvida den inte deklareras i andra källfiler som använder den.

Källfil 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
}

Källfil C3861_a2.cpp:

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

Namnområdeskvalifikation krävs

Undantagsklasser i C++-standardbiblioteket kräver std namnområdet.

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

Föråldrad funktion anropad

Föråldrade funktioner har tagits bort från CRT-biblioteket.

// 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- och vänfunktioner

I följande exempel genereras C3861 eftersom kompilatorn inte kan använda argumentberoende sökning för 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
}

Åtgärda felet genom att deklarera vännen i klassomfånget och definiera det i namnområdesomfånget:

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

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

int main() {
   func();
}