C/C++でやっています。
C/C++で例外処理ってありますよね。
今までは int型で投げていたのですが、std::exception を継承すればより簡単にできるようなので
それに切り替えようかと思っています。
ここまではいいのですが、試しにやってみたところ、
なぜかエラー...
普通のエラーは読めて、ある程度パターンから推測 & 修正できますが、STL関連なので...
C++
1#include<iostream> 2#include<exception> 3#include<string> 4 5namespace EXCEPTION{ 6 // 例外用クラス 7 class MyException : public std::exception{ 8 public: 9 MyException( const std::string &str ) : std::exception(str){} 10 ~MyException(){} 11 }; 12 13 // 例外を投げる関数 14 void ThrowException( void ) throw(MyException){ 15 throw MyException( "DLLがない...の?" ); // 今回は"例外用クラス"に関してなので 確実に投げる。 16 } 17 18 // 実際に例外を受け取る関数 19 void Check( void ){ 20 try{ 21 ThrowException(); 22 }catch( MyException &e ){ 23 cout << e.what() << endl; 24 } 25 26 return; 27 } 28} 29 30int main( void ){ 31 EXCEPTION::func(); 32return 0; 33}
としました。
ですがコンパイルしようとすると
(ファイル名): In constructor 'EXCEPTION::MyException::MyException(const string&)': (ファイル名):(行番号):(列数?): error: no matching function for call to 'std::exception::exception(const string&)' MyException( const std::string &str ) : std::exception(str){}
と出てコンパイルできません。
何がいけないのでしょうか?
std::exceptionはpublicで継承しているし、上記でいう、MyExcepitonクラスのコンストラクタから親クラスに 引数を渡しているはずなのに...
普通に
C++
1#include<iostream> 2#include<exception> 3#include<string> 4 5namespace EXCEPTION{ 6 class MyException : public std::exception{ 7 public: 8 MyException( const std::string &str ) : m_error(str){} 9 ~MyException(){}; 10 11 const char* what( void ){ return m_error.c_str(); } 12 private: 13 std::string m_error; 14 }; 15 16 ... // 以下省略 17} 18
とすれば普通に動きますが、継承の意味があまりない...
( せいぜい、親クラスである std::exception で受け取れるぐらい )
それだったら独自のクラスとして定義すればいいと思うし...
何がいけないのでしょうか。
もしかすると私のスペルミスとかかもしれないし...
と考えてチェックしてみましたが、
私からすると「間違っていない」。
どうすればいいでしょうか。
Boostにも boost::exception があるようですが、
できれば C++ の範囲のみ ( C++で提供されているもの ) で出来たらいいのですが...
[情報]
言語 : C/C++
コンパイラ : MinGW
知りたいこと: C++でのstd::exceptionを継承した独自の例外クラス定義方法
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。