1

基本例外クラスの派生元である例外階層を使用してboost::exception、そのクラスが提供する便利な診断情報を取得し、スレッド間で例外をスローできるようにしたいと考えています。 QtConcurrent::Exception

したがって、私の基本例外クラスは次のようになります。

class MyException : public QtConcurrent::Exception, public boost::exception
{
public:
    MyException() { };
    virtual ~MyException() throw() { }

    // required by QtConcurrent::Exception to be implemented
    virtual void raise() const { throw *this; }
    virtual MyException* clone() const { return new MyException(*this); }
};

PerQtConcurrent::Exceptionのドキュメントでraise()あり、clone()から派生したクラスで実装する必要がありますQtConcurrent::Exception。したがって、残りのコードは次のようになります。

void foo()
{
    BOOST_THROW_EXCEPTION(MyException());
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    try
    {
        foo();
    }
    catch (const MyException& me)
    {
        std::cerr << boost::diagnostic_information(me);
    }

    return 0;
}

ただし、BOOST_THROW_EXCEPTION()マクロを使用すると、次のコンパイル エラーが発生します。

エラー C2555: 'boost::exception_detail::clone_impl::clone': 仮想関数の戻り値の型のオーバーライドが異なり、'MyException::clone' と共変ではありません

このエラーが私に何を伝えているのか完全にはわかりません (エラーではなく私のせいです!)。

代わりthrow MyException();にコードを使用すると、問題なくコンパイルされます。BOOST_THROW_EXCEPTION()上で述べたように、例外で診断情報を取得するために使用したいと思います。

QtConcurrent::Exception考えられる回避策の 1 つは、boost::exception メンバー (本質的には実際のエラーのコンテナー)から派生した別のクラスである可能性があることを知っています。MyExceptionしかし、可能であれば、boost::exception と boost::exceptionの両方からクラスを継承したいと考えていQtConcurrent::Exceptionます。

エラーが何を言っているのかについて誰かが洞察を提供できますか? 私が望むことを達成する方法はありますか?

4

0 に答える 0