コンパイラ エラー 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();
}