

カスタム例外処理のコードを作っています。  
しかし、list_errorクラスでwhat()を定義しようとすると次のようなメッセージが出てしまします。

[code]

    Virtual function 'what' has a different return type ('std::string' (aka 'basic_string<char, char_traits<char>, allocator<char>>')) than the function it overrides (which has return type 'const char *')
    
[/code]

これは元の設定を何か変更する必要があるのでしょうか。わかる方よろしくお願いします。

[code]

    #include <string>
    #include<exception>
    
    
    using std::string;
    
    class list_error : public std::exception{
    private:
        string errorMessage;
    public:
        list_error(string errorMessage = "") : errorMessage(errorMessage){}
        virtual ~list_error(){}
        string what() const {return this->errorMessage;}
    };
    
[/code]


CC BY-SA 4.0
2021-05-30T00:30:27.387
76184
2021-05-30T01:01:40.573
2021-05-30T00:36:47.390
26370
45177
question
c++
例外処理でwhat()が定義できない


エラーメッセージにあるように、戻り値の型が違うので`const char *`にする必要があるでしょう。  
`errorMessage`も同じ型で定義するか、使用時(what()のreturn時)に変換する必要があるでしょう。

[第 5 章 例外処理(C++
プログラミングガイド)](https://docs.oracle.com/cd/E19957-01/805-7887/6j7dsdhf1/index.html)

> 実行時関数と事前定義された例外の使用  
>  標準ヘッダー には、C++ 標準に規定されたクラスおよび例外に関連する関数が含まれています。このヘッダーにアクセスできるのは、標準モードで
> (コンパイラのデフォルトモード、あるいはオプション -compat=5 を使用して)
> コンパイルする場合だけです。次に、標準ヘッダーに含まれる宣言を示します。
[code]

>     // 前後は省略
>     virtual const char* what() const throw();
>  
[/code]

>
> 標準クラス exception は、選択されている言語構造または C++ 標準ライブラリによって送出されるすべての例外の基底クラスです。
> exception 型のオブジェクトについては、例外を生成することなく構築、コピー、破壊が可能です。仮想メンバー関数 what()
> は、例外を説明する文字列を返します。

[例外処理](http://kaitei.net/cpp/exceptions/)

[code]

    // 例外を表すクラス
    class some_exception
    {
    private:
        const char* msg;   // 例外を説明するメッセージ
    public:
        some_exception(const char* msg) : msg(msg) { }  // コンストラクタ
        const char* what() { return msg; }  // メッセージを返す
    };
    
[/code]

[c++ create a class exception](https://stackoverflow.com/q/35215169/9014308)

>
[code]

>     class Exception : public std::exception
>     {
>         std::string _msg;
>     public:
>         Exception(const std::string& msg) : _msg(msg){}
>  
>         virtual const char* what() const noexcept override
>         {
>             return _msg.c_str();
>         }
>     };
>  
[/code]


CC BY-SA 4.0
2021-05-30T01:01:40.573
76186
2021-05-30T01:01:40.573
26370
76184
answer