編譯器錯誤 C3861
'identifier':找不到識別項
即使使用自變數相依查閱,編譯程式也無法解析標識符的參考。
備註
若要修正此錯誤,請將標識碼的使用 與大小寫和拼字的標識碼 宣告進行比較。 確認 已正確使用範圍解析運算符 和命名空間 using
指示 詞。 如果在頭檔中宣告標識碼,請在參考標識碼之前確認標頭已包含。 如果標識碼是要在外部可見,請確定該標識碼已在使用該標識碼的任何原始程序檔中宣告。 也請檢查條件式編譯指示詞不會排除標識符宣告或定義。
從 Visual Studio 2015 中的 C 運行時間連結庫移除過時函式的變更可能會導致 C3861。 若要解決此錯誤,請移除這些函式的參考,或將其取代為其安全替代方案,如果有的話。 如需詳細資訊,請參閱 過時的函式。
如果從舊版編譯程式移轉項目之後出現錯誤 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();
}