基本例外クラスの派生元である例外階層を使用して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
ます。
エラーが何を言っているのかについて誰かが洞察を提供できますか? 私が望むことを達成する方法はありますか?