Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
«Identificador» : identificador não declarado
Observações
O compilador não consegue encontrar a declaração para um identificador. Existem muitas causas possíveis para este erro. As causas mais comuns do C2065 são que o identificador não foi declarado, o identificador está escrito incorretamente, o cabeçalho onde o identificador é declarado não está incluído no arquivo ou o identificador está faltando um qualificador de escopo, por exemplo, cout em vez de std::cout. Para obter mais informações sobre declarações em C++, consulte Declarações e definições (C++).
Aqui estão alguns problemas comuns e soluções em maior detalhe.
O identificador não é declarado
Se o identificador for uma variável ou um nome de função, você deverá declará-lo antes que ele possa ser usado. Uma declaração de função também deve incluir os tipos de seus parâmetros antes que a função possa ser usada. Se a variável for declarada usando auto, o compilador deve ser capaz de inferir o tipo de seu inicializador.
Se o identificador for um membro de uma classe ou struct, ou declarado em um namespace, ele deverá ser qualificado pelo nome da classe ou struct, ou pelo nome do namespace, quando usado fora do escopo struct, class ou namespace. Como alternativa, o namespace deve ser colocado em escopo por uma using diretiva como using namespace std;, ou o nome do membro deve ser trazido para o escopo por uma using declaração, como using std::string;. Caso contrário, o nome não qualificado é considerado um identificador não declarado no escopo atual.
Se o identificador for a tag de um tipo definido pelo usuário, por exemplo, a class ou struct, o tipo da tag deverá ser declarado antes de poder ser usado. Por exemplo, a declaração struct SomeStruct { /*...*/ }; deve existir antes que você possa declarar uma variável SomeStruct myStruct; em seu código.
Se o identificador for um alias de tipo, o tipo deve ser declarado por uma using declaração ou typedef antes de poder ser usado. Por exemplo, você deve declarar using my_flags = std::ios_base::fmtflags; antes de poder usar my_flags como um alias de tipo para std::ios_base::fmtflags.
Exemplo: identificador com erros ortográficos
Este erro geralmente ocorre quando o nome do identificador está escrito incorretamente ou o identificador usa as letras maiúsculas e minúsculas erradas. O nome na declaração deve corresponder exatamente ao nome que você usa.
// C2065_spell.cpp
// compile with: cl /EHsc C2065_spell.cpp
#include <iostream>
using namespace std;
int main() {
int someIdentifier = 42;
cout << "Some Identifier: " << SomeIdentifier << endl;
// C2065: 'SomeIdentifier': undeclared identifier
// To fix, correct the spelling:
// cout << "Some Identifier: " << someIdentifier << endl;
}
Exemplo: usar um identificador sem escopo
Este erro pode ocorrer se o identificador não tiver o escopo correto. Se você vir C2065 quando você usa cout, um problema de escopo é a causa. Quando as funções e operadores da Biblioteca Padrão do C++ não são totalmente qualificados pelo namespace, ou você não trouxe o std namespace para o escopo atual usando uma using diretiva, o compilador não pode encontrá-los. Para corrigir esse problema, você deve qualificar totalmente os nomes de identificador ou especificar o namespace com a using diretiva .
Este exemplo falha ao compilar porque cout e endl são definidos no std namespace:
// C2065_scope.cpp
// compile with: cl /EHsc C2065_scope.cpp
#include <iostream>
// using namespace std; // Uncomment this line to fix
int main() {
cout << "Hello" << endl; // C2065 'cout': undeclared identifier
// C2065 'endl': undeclared identifier
// Or try the following line instead
std::cout << "Hello" << std::endl;
}
Os identificadores declarados dentro de class, structou enum class tipos também devem ser qualificados pelo nome de seu escopo de inclusão quando você os usa fora desse escopo.
Exemplo: cabeçalho pré-compilado não é o primeiro
Este erro pode ocorrer se você colocar quaisquer diretivas de pré-processador, como #include, , ou #pragma, antes de um #include arquivo de cabeçalho pré-compilado#define. Se o arquivo de origem usar um arquivo de cabeçalho pré-compilado (ou seja, se ele for compilado usando a /Yu opção de compilador), todas as diretivas de pré-processador antes do arquivo de cabeçalho pré-compilado serão ignoradas.
Este exemplo falha ao compilar porque cout e endl são definidos no <iostream> cabeçalho, que é ignorado porque é incluído antes do arquivo de cabeçalho pré-compilado. Para criar este exemplo, crie todos os três arquivos, compile pch.h (algumas versões do Visual Studio usam stdafx.cpp) e compile C2065_pch.cpp.
// pch.h (stdafx.h in Visual Studio 2017 and earlier)
#include <stdio.h>
O pch.h arquivo ou stdafx.h de origem:
// pch.cpp (stdafx.cpp in Visual Studio 2017 and earlier)
// Compile by using: cl /EHsc /W4 /c /Ycstdafx.h stdafx.cpp
#include "pch.h"
Ficheiro de origem C2065_pch.cpp
// C2065_pch.cpp
// compile with: cl /EHsc /W4 /Yustdafx.h C2065_pch.cpp
#include <iostream>
#include "stdafx.h"
using namespace std;
int main() {
cout << "Hello" << endl; // C2065 'cout': undeclared identifier
// C2065 'endl': undeclared identifier
}
Para corrigir esse problema, adicione o #include de no arquivo de cabeçalho pré-compilado ou mova-o depois que o arquivo de cabeçalho pré-compilado for incluído no arquivo de <iostream> origem.
Exemplo: arquivo de cabeçalho ausente
O erro pode ocorrer se você não tiver incluído o arquivo de cabeçalho que declara o identificador. Verifique se o arquivo que contém a declaração para o identificador está incluído em cada arquivo de origem que o usa.
// C2065_header.cpp
// compile with: cl /EHsc C2065_header.cpp
//#include <stdio.h>
int main() {
fpos_t file_position = 42; // C2065: 'fpos_t': undeclared identifier
// To fix, uncomment the #include <stdio.h> line
// to include the header where fpos_t is defined
}
Outra causa possível é se você usar uma lista de inicializadores sem incluir o <cabeçalho initializer_list> .
// C2065_initializer.cpp
// compile with: cl /EHsc C2065_initializer.cpp
// #include <initializer_list>
int main() {
for (auto strList : {"hello", "world"})
if (strList == "hello") // C2065: 'strList': undeclared identifier
return 1;
// To fix, uncomment the #include <initializer_list> line
}
Poderá ver este erro nos ficheiros de origem da aplicação de ambiente de trabalho do Windows se definir VC_EXTRALEAN, WIN32_LEAN_AND_MEANou WIN32_EXTRA_LEAN. Essas macros de pré-processador excluem alguns arquivos de cabeçalho de windows.h e afxv_w32.h para acelerar compilações. Procure uma windows.hafxv_w32.h descrição up-to-date do que está excluído.
Exemplo: falta de cotação de fechamento
Este erro pode ocorrer se você estiver faltando uma cotação de fechamento após uma constante de cadeia de caracteres. É uma maneira fácil de confundir o compilador. A cotação de fechamento ausente pode ser várias linhas antes do local de erro relatado.
// C2065_quote.cpp
// compile with: cl /EHsc C2065_quote.cpp
#include <iostream>
int main() {
// Fix this issue by adding the closing quote to "Aaaa"
char * first = "Aaaa, * last = "Zeee";
std::cout << "Name: " << first
<< " " << last << std::endl; // C2065: 'last': undeclared identifier
}
Exemplo: usar iterador fora para escopo de loop
Esse erro pode ocorrer se você declarar uma variável iteradora em um for loop e, em seguida, tentar usar essa variável iterador fora do escopo do for loop. O compilador habilita a /Zc:forScope opção de compilador por padrão. Para obter mais informações, consulte Debug iterator support.
// C2065_iter.cpp
// compile with: cl /EHsc C2065_iter.cpp
#include <iostream>
#include <string>
int main() {
// char last = '!';
std::string letters{ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" };
for (const char& c : letters) {
if ('Q' == c) {
std::cout << "Found Q!" << std::endl;
}
// last = c;
}
std::cout << "Last letter was " << c << std::endl; // C2065
// Fix by using a variable declared in an outer scope.
// Uncomment the lines that declare and use 'last' for an example.
// std::cout << "Last letter was " << last << std::endl; // C2065
}
Exemplo: declaração removida do pré-processador
Este erro pode ocorrer se você se referir a uma função ou variável que está em código compilado condicionalmente que não é compilado para sua configuração atual. O erro também pode ocorrer se você chamar uma função em um arquivo de cabeçalho que atualmente não é suportado em seu ambiente de compilação. Se determinadas variáveis ou funções só estiverem disponíveis quando uma macro de pré-processador específica for definida, certifique-se de que o código que chama essas funções só pode ser compilado quando a mesma macro de pré-processador estiver definida. Esse problema é fácil de detetar no IDE: a declaração para a função fica acinzentada se as macros de pré-processador necessárias não estiverem definidas para a configuração de compilação atual.
Aqui está um exemplo de código que funciona quando você cria em Depurar, mas não em Release:
// C2065_defined.cpp
// Compile with: cl /EHsc /W4 /MT C2065_defined.cpp
#include <iostream>
#include <crtdbg.h>
#ifdef _DEBUG
_CrtMemState oldstate;
#endif
int main() {
_CrtMemDumpStatistics(&oldstate);
std::cout << "Total count " << oldstate.lTotalCount; // C2065
// Fix by guarding references the same way as the declaration:
// #ifdef _DEBUG
// std::cout << "Total count " << oldstate.lTotalCount;
// #endif
}
Exemplo: Falha de dedução do tipo C++/CLI
Este erro pode ocorrer ao chamar uma função genérica, se o argumento de tipo pretendido não puder ser deduzido dos parâmetros usados. Para obter mais informações, consulte Funções genéricas (C++/CLI).
// C2065_b.cpp
// compile with: cl /clr C2065_b.cpp
generic <typename ItemType>
void G(int i) {}
int main() {
// global generic function call
G<T>(10); // C2065
G<int>(10); // OK - fix with a specific type argument
}
Exemplo: parâmetros de atributo C++/CLI
Este erro também pode ser gerado como resultado do trabalho de conformidade do compilador que foi feito para o Visual Studio 2005: verificação de parâmetros para atributos do Visual C++.
// C2065_attributes.cpp
// compile with: cl /c /clr C2065_attributes.cpp
[module(DLL, name=MyLibrary)]; // C2065
// try the following line instead
// [module(dll, name="MyLibrary")];
[export]
struct MyStruct {
int i;
};