2011-08-27 10 views
6

私はUbuntuの下のG ++でこれをコンパイルしようとしています:、コンパイルエラーは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 

私は、エラー・メッセージが表示されます:

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 

私が持っています今のところこの問題がありましたが、実際には何が間違っているのかわかりません:/

答えて

14

コンパイラはエラーメッセージを通じて重要なことを伝えます。私たちは最初のメッセージを取れば(発生したことによって最初に始め、常に1でコンパイルの問題の1の世話をするのは良いことです):それはあり行9を見てわかります

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

"{"の直前のコードの問題:クラス名が無効です。このことから、コンパイラは "std :: runtime_error"が何であるかを知ることができないことを推測することができます。これは、コンパイラが、あなたが提供したヘッダで "std :: runtime_error"を見つけられないことを意味します。正しいヘッダーが含まれているかどうかを確認する必要があります。

C++リファレンスドキュメントのクイック検索では、std :: runtime_errorが<stdexcept>ヘッダーの一部であり、<exception>ではないことがわかります。それはよくある間違いです。

このヘッダーを追加するだけで、エラーはなくなります。他のエラーメッセージから、コンパイラは同じことをコンストラクタに伝えます。

コンパイルのエラーメッセージを読むことを学ぶことは、コンパイルの問題でブロックされないようにするために非常に重要なスキルです。

+0

おかげで日光:D – SlimJim

+0

+1父親のアドバイスのために:) – Chani

6

<stdexcept>です。

+0

あなたの署名をすべて編集しています。それを書き留めてもよいでしょう。私たちにいくつかの問題を保存します。 _それは礼儀正しいでしょう。 :-) –

+0

@Tomalak:SOには多くの幼稚なユーザーがいますが、私は個人的な部分は気にしません。 –

+0

小学生は普段の意見を受け入れることを頑なに拒否しています。 :( –

1

派生した時点で、std::runtime_errorの完全な定義が必要です。

#include <stdexcept> 
関連する問題