2017-12-14 14 views
1

から「互換性のない型の引数」、提示されているエラーがある:タイプの以下のコードの場合には継承クラス

引数「ThatThingThatUsesExceptions :: HereBeTheError *」は、パラメータと互換性がありませんタイプ "例外*"

これは私の実際のコードから示されるように、完全な誤りである:タイプの

(アクティブ)E0167引数は、 "入力:: ErrorNoPinSet *は" W互換性がありませんタイプのi番目のパラメータ "例外*" AddingOOP C:\私はドローンのために大量のコードを書いて、コードのように多くのようだMyFilePathToMyRepoDir \ DroneSoftware \ ArduinoBasedCode \ AddingOOP \ Input.cpp 17

残念なことに通常はtry-catchエラー処理を使用する能力を持たないマイクロコントローラ上で動作します。私はおそらくこれは非常にハックインな方法で実装しようとしていますが、私は多少の問題にぶち当たっています。

class Exception 
{ 
public: 
    static void eThrowException(Exception* error) 
    { 
     Serial.println(error->what()); 
    } 

    virtual const char* what(); 
}; 

class ThingThatUsesTheExceptions 
{ 
private: 
    struct HereBeTheError : public Exception { const char* what() { return "Yarrrrr me matey"; } }; 

protected: 
    void cFunctionThatTriggersAnError() 
    { 
     Exception::eThrowException(&HereBeTheError()); //This is where the error occurs. 
    } 
}; 

私はこれらのすべてが自分のファイルに分割されていることを言及する必要があります:

は、これは何が起こっているかの非常に単純化したバージョンです。 Exception.hは宣言を保持し、Exception.cppは定義を保持し、ThatThingThatUsesExceptionsと同じものを保持します。私はなぜエラーが投げているのか分かりません。私はeThrowExceptionに以下の組み合わせを渡して、多くの異なる組み合わせでそれを試してみた:

&HereBeTheError() 
*HereBeTheError() 
new HereBeTheError() 
HereBeTheError() 
*new HereBeTheError() 
&new HereBeTheError() 

私はかなり愚かなように見えたいくつかのことを含め、私は考えることができるすべてのものを試してみたが、私はオプションの外でしたし、私が考えることができるすべてのオプションを試してみることにしました。

ご協力いただきありがとうございます!エラーメッセージ++ gの

+0

これは、 'virtual const char * what();'を定義せずにクラス 'Exception'に宣言すると、リンクエラーが発生するはずです。純仮想に設定すると、G ++ 7.2 –

答えて

0

少し少ない曖昧である:

prog.cpp:22:52: error: taking address of temporary [-fpermissive] 

代替new HereBeTheError()はコンパイルだろうが、メモリリークをもたらします。あなたはまた、参照することにより代わりのポインタで引数を渡すために行くことができ

HereBeTheError a; 
    Exception::eThrowException(&a); //This works 

:それを行うには

作業の方法は、ローカル変数を使用することです。次に、const参照(demo)という条件の下で一時的に渡すことができます。