以下代码生成“松散的抛出指定符错误”。您能帮我克服这个错误吗?

class base
{
    virtual void abc() throw (exp1);
}

void base::abc() throw (exp1)
{
    ......
}

class sub : public base
{
    void abc() throw(exp1, exp2);
}

void sub::abc() throw (exp1, exp2)
{
    .....
}

最佳答案

之所以会出现问题,是因为子类必须在可以使用基类的任何地方都可用,并且不得抛出除基类中指定的以外的任何异常类型。

有三种解决方案:

  • 修改基类说明符,以包括任何子类可能需要抛出的所有异常类型
  • 修改每个子类以处理除基类
  • 中指定的那些以外的所有异常类型
  • 删除异常说明符。

  • 我建议删除它们;他们被广泛认为是一个坏主意,部分原因是因为这样的问题。正如Matthieu所指出的那样,标准委员会对此表示同意,并且在下一版标准中将弃用异常说明符。

    08-03 13:56