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具有 boost::exception 成员的类,本质上是实际错误的容器。但如果可能的话,我想继续让这个MyException类继承自QtConcurrent::Exceptionboost::exception 和 boost::exception。

有人可以提供一些关于错误在说什么的见解吗?有什么办法可以完成我想要的吗?

4

0 回答 0