2011-08-27 15 views
6

estoy tratando de recopilar esto con g ++ en Ubuntu:de compilación de error cuando se intenta heredar de std :: runtime_error

#ifndef PARSEEXCEPTION_H 
#define PARSEEXCEPTION_H 

#include<exception> 
#include<string> 
#include<iostream> 

struct ParseException : public std::runtime_error 
{ 
    explicit ParseException(const std::string& msg):std::runtime_error(msg){}; 
    explicit ParseException(const std::string& token,const std::string& found):std::runtime_error("missing '"+token+"',instead found: '"+found+"'"){}; 

}; 

#endif 

me sale el error de mensaje:

In file included from parseexception.cpp:1: 
parseexception.h:9: error: expected class-name before ‘{’ token 
parseexception.h: In constructor ‘ParseException::ParseException(const std::string&)’: 
parseexception.h:10: error: expected class-name before ‘(’ token 
parseexception.h:10: error: expected ‘{’ before ‘(’ token 
parseexception.h: In constructor ‘ParseException::ParseException(const std::string&, const std::string&)’: 
parseexception.h:11: error: expected class-name before ‘(’ token 
parseexception.h:11: error: expected ‘{’ before ‘(’ token 
enter code here 

tengo tuvo este problema por algún tiempo y realmente no puedo ver lo que está mal con él:/

Respuesta

14

El compilador a través de sus mensajes de error le dice cosas importantes. Si tomamos sólo el primer mensaje (siempre es una buena cosa para hacerse cargo de los problemas de compilación, uno por uno, comenzando por el primero que se produjo):

parseexception.h:9: error: expected class-name before ‘{’ token 

Se le dice que busque en la línea 9. Hay un problema en el código justo antes de "{": el nombre de la clase no es válido. Puede deducir de esto que el compilador puede no saber qué es "std :: runtime_error". Esto significa que el compilador no encuentra "std :: runtime_error" en los encabezados que proporcionó. Luego debe verificar si ha incluido los encabezados correctos.

Una búsqueda rápida en una documentación de referencia C++ le dirá que std :: runtime_error es parte del encabezado <stdexcept>, no <exception>. Ese es un error común.

Simplemente tiene que agregar este encabezado y el error se ha ido. De los otros mensajes de error, el compilador le dice casi las mismas cosas, pero en los constructores.

Aprender a leer los mensajes de error del compilador es una habilidad muy importante para evitar bloquearse en los problemas de compilación.

+0

muchas gracias Nikko: D – SlimJim

+0

+1 por el consejo paternal :) – Chani

6

incluye <stdexcept>.

+0

Estamos editando su firma. Bien podría dejar de escribirlo. Ahórrenos algunos problemas. _Eso_ sería educado. :-) –

+0

@Tomalak: SO tiene muchos usuarios infantiles, no me importa la parte personal de eso, solo que es triste en la imagen global. –

+0

Infantil se niega obstinadamente a aceptar la opinión popular. :( –

1

Necesita tener una definición completa de std::runtime_error disponible en el punto que deriva de ella.

#include <stdexcept> 
Cuestiones relacionadas