次の方法で共有


コンパイラ エラー C3861

'identifier': 識別子が見つかりませんでした

引数に依存する参照を使用しても、コンパイラは識別子への参照を解決できませんでした。

解説

このエラーを解決するには、大文字と小文字の区別やスペルの観点から、identifier の使い方を識別子の宣言と比較します。 スコープ解決演算子および名前空間usingディレクティブが正しく使用されていることを確認します。 識別子がヘッダー ファイルで宣言されている場合は、識別子の参照前にこのヘッダーがインクルードされていることを確認します。 識別子が外部から表示されるようにする場合は、それを使用するソース ファイルで宣言されていることを確認します。 また、識別子の宣言または定義が、 conditional コンパイル ディレクティブによって除外されていないことも確認します

Visual Studio 2015 の C ランタイム ライブラリから古い関数を削除するための変更が C3861 の原因となる可能性があります。 このエラーを解決するには、それらの関数への参照を削除するか、安全な代替手段 (存在する場合) に置き換えてください。 詳細については、 Obsolete 関数を参照してください。

古いバージョンのコンパイラからプロジェクトを移行した後にエラー 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;
}

名前空間の修飾が必要

C++ 標準ライブラリの例外クラスには、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;
   }
}

古い関数が呼び出された

古くなった関数は 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 と friend 関数

次の例では 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
}

このエラーを解決するには、クラス スコープで friend を宣言し、それを名前空間スコープで定義します。

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

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

int main() {
   func();
}