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.
erro de sintaxe: falta 'token' antes do identificador 'identifier'
Observações
O compilador esperava token e encontrava identifier em vez disso. Causas possíveis:
Erro de ortografia ou maiúsculas.
Especificador de tipo ausente na declaração do identificador.
Este erro pode ser causado por um erro tipográfico. O erro C2065 geralmente precede esse erro.
Exemplos
O exemplo a seguir gera C2146.
// C2146.cpp
class CDeclaredClass {};
class CMyClass {
CUndeclared m_myClass; // C2146
CDeclaredClass m_myClass2; // OK
};
int main() {
int x;
int t x; // C2146 : missing semicolon before 'x'
}
Este erro também pode ser gerado como resultado do trabalho de conformidade do compilador que foi feito para Visual Studio .NET 2003: palavra-chave ausente typename .
O exemplo a seguir compila no Visual Studio .NET 2002, mas falhará no Visual Studio .NET 2003:
// C2146b.cpp
// compile with: /c
template <typename T>
struct X {
struct Y {
int i;
};
Y memFunc();
};
template <typename T>
X<T>::Y func() { } // C2146
// OK
template <typename T>
typename X<T>::Y func() { }
Você também verá esse erro como resultado do trabalho de conformidade do compilador que foi feito para o Visual Studio .NET 2003: especializações explícitas não encontram mais parâmetros de modelo do modelo primário.
O uso do T do modelo primário não é permitido na especialização explícita. Para que o código seja válido no Visual Studio .NET 2003 e Visual Studio .NET, substitua todas as instâncias do parâmetro de modelo na especialização pelo tipo explicitamente especializado.
O exemplo a seguir compila no Visual Studio .NET, mas falhará no Visual Studio .NET 2003:
// C2146_c.cpp
// compile with: /c
template <class T>
struct S;
template <>
struct S<int> {
T m_t; // C2146
int m_t2; // OK
};