10 errores de compilador en C++ — y qué significan de verdad

Cómo usar esta guía: busca tu mensaje de error, salta a su entrada, arréglalo. Y la regla general primero: arregla solo el PRIMER error y vuelve a compilar — un punto y coma que falta puede generar diez errores en cascada, y del segundo al décimo suelen desaparecer solos.

1. error: expected ';' before '}' token

Qué significa: a una instrucción de arriba le falta el punto y coma. El compilador suele señalarlo una línea después del error real.

int x = 5      // ← falta ';' aquí
cout << x;

Cómo se arregla: pon el punto y coma. Cuando veas este error, mira primero el final de la línea anterior.

2. 'cout' was not declared in this scope

Qué significa: el compilador no tiene idea de qué es cout — normalmente porque falta <iostream>, o falta using namespace std; (sin ella hay que escribir std::cout).

#include <iostream>        // sin esta línea: error
using namespace std;       // sin esta: 'cout' desconocido

int main() {
    cout << "hi" << endl;
}

3. 'x' was not declared in this scope

Qué significa: usaste un nombre que el compilador no ha visto. Dos causas habituales: una errata (cont en vez de count — C++ además distingue mayúsculas: Count ≠ count), o usar una variable antes de declararla.

int main() {
    x = 5;        // ← error: todavía no existe nada llamado x
    int x;
}

4. fatal error: iostrem: No such file or directory

Qué significa: el nombre de un #include está mal escrito. El compilador te dice exactamente qué nombre no encontró — léelo carácter a carácter.

#include <iostrem>   // ← errata: debería ser <iostream>

5. error: invalid conversion from 'const char*' to 'char'

Qué significa: comillas simples contra comillas dobles. 'a' es un carácter; "a" es una cadena. Mezclarlas donde tocaba la otra produce este error (o un primo hermano).

char c = "a";   // ← "a" es una cadena; usa 'a'
string s = 'a'; // ← 'a' es un carácter; usa "a"

6. error: expected '}' at end of input

Qué significa: falta una llave de cierre en alguna parte. El compilador llegó al final del archivo todavía esperándola — el fallo suele estar muchas líneas más arriba, en la apertura de un bloque.

Cómo se arregla: cuenta las llaves, o deja que tu editor resalte el par correspondiente. Indentar de verdad hace visibles los desajustes.

7. undefined reference to 'main' — un error del ENLAZADOR

Qué significa: fíjate en la palabra nueva: enlazador (linker), no compilador. Tu código compiló, pero no hay punto de entrada — normalmente main está mal escrito (Main, mian) o no existe. Ver qué es int main().

int Main() {   // ← M mayúscula: esto es solo una función cualquiera
    return 0;
}

8. undefined reference to 'sayHi()' — también del enlazador

Qué significa: la función se declaró (se prometió) pero nunca se definió (no se entregó), o su archivo .cpp no se compiló o no se enlazó.

void sayHi();          // declaración: "existe, confía en mí"

int main() {
    sayHi();           // el enlazador: "¿dónde está?!" — el cuerpo nunca se escribió
}

9. unresolved external symbol "sayHi" (Visual Studio)

Qué significa: exactamente el mismo problema de enlazado que el 8 — el compilador de Microsoft simplemente usa otras palabras. Aprender las dos formas duplica los mensajes de error que puedes descifrar desde los resultados de búsqueda.

10. Las líneas warning: — las que los principiantes ignoran (no lo hagas)

Qué significa: un aviso dice «esto compila, pero huele mal»: variables sin usar, valores sin inicializar, conversiones implícitas que pierden datos. Los avisos no detienen la compilación — y justo por eso la gente se salta bugs reales que se esconden detrás. Trata cada aviso como un bug que todavía no has conocido.

Un programa que compila limpio

La versión corregida de los clásicos de arriba — ejecútala como comprobación rápida después de arreglar tu propio error:

#include <iostream>
using namespace std;

void sayHi() {
    cout << "hi!" << endl;
}

int main() {
    int x = 5;        // declarada antes de usarla
    char c = 'a';     // char con comillas simples
    cout << x << " " << c << endl;
    sayHi();
    return 0;
}

La rutina general de depuración

  1. Lee solo el primer error. Arréglalo. Recompila. (Los errores van en cascada — el resto suelen ser ecos.)
  2. Revisa la línea que nombra el compilador y luego la de encima. Que se desvíe una línea es normal.
  3. Error de compilador contra error de enlazador: «error:» significa reglas del lenguaje; «undefined reference / unresolved external» significa que una función prometida nunca se entregó.
  4. Buscar el mensaje exacto funciona — quita antes tus rutas y nombres de variable, conserva la parte genérica del mensaje.

Relacionado: qué es int main() (el error 7 explicado a fondo), cin vs getline (los bugs de entrada en ejecución, la otra mitad del dolor principiante) y la lección Hello World, donde el error 1 hace un cameo.