2011-08-27 9 views
6

Sto cercando di compilare questo con g ++ sotto Ubuntu:compilazione di errore quando si cerca di ereditare da 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 

ottengo l'errore-messaggio:

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 

ho ha avuto questo problema per qualche ora e non riesco davvero a capire che cosa non va:/

risposta

14

Il compilatore tramite i suoi messaggi di errore ti dice cose importanti. Se prendiamo solo il primo messaggio (è sempre una buona cosa per prendersi cura dei problemi di compilazione ad uno ad uno, a partire dalla prima che si è verificato):

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

Ti dice di guardare la linea 9. C'è un problema nel codice poco prima di : il nome della classe non è valido. Da questo si può dedurre che il compilatore potrebbe non sapere cosa sia "std :: runtime_error". Ciò significa che il compilatore non trova "std :: runtime_error" nelle intestazioni che hai fornito. Quindi devi controllare se hai incluso le intestazioni corrette.

Una ricerca rapida in una documentazione di riferimento C++ ti dirà che std :: runtime_error fa parte dell'intestazione <stdexcept>, non <exception>. Questo è un errore comune.

Devi solo aggiungere questa intestazione e l'errore è scomparso. Dagli altri messaggi di errore, il compilatore ti dice praticamente le stesse cose, ma nei costruttori.

Imparare a leggere i messaggi di errore del compilatore è un'abilità molto importante per evitare di essere bloccato sui problemi di compilazione.

+0

grazie mille Nikko: D – SlimJim

+0

+1 per il consiglio paterno :) – Chani

6

include <stdexcept>.

+0

Stiamo modificando la tua firma. Tanto vale smettere di scriverlo. Salvaci qualche problema. Questo sarebbe educato. :-) –

+0

@Tomalak: SO ha un sacco di utenti infantili, non mi interessa la parte personale di questo, solo che è triste nel quadro globale. –

+0

Childish si rifiuta ostinatamente di accettare l'opinione popolare. :( –

1

È necessario disporre di una definizione completa di std::runtime_error disponibile nel punto da cui si ottiene.

#include <stdexcept> 
Problemi correlati