概念的には次のような例外クラス階層を作成しようとしています。
#include <iostream>
#include <stdexcept>
class ExceptionBase : public std::runtime_error {
public:
ExceptionBase( const char * msg ) : std::runtime_error(msg) {}
};
class OperationFailure : virtual public ExceptionBase {
public:
using ExceptionBase::ExceptionBase;
};
class FileDoesNotExistError : virtual public ExceptionBase {
public:
using ExceptionBase::ExceptionBase;
};
class OperationFailedBecauseFileDoesNotExistError
: public OperationFailure, FileDoesNotExistError {
public:
using ExceptionBase::ExceptionBase; // does not compile
};
int main() {
OperationFailedBecauseFileDoesNotExistError e("Hello world!\n");
std::cout << e.what();
}
ExceptionBase
すべてのコンストラクターは、クラスのコンストラクターと同じに見える必要があります。派生した例外は、その型に関してのみ異なります。それ以外の追加機能はありません。上記のコードで言及されている最後の例外タイプにも、これらのコンストラクターが必要です。これは、C++11 標準の継承コンストラクター機能を使用して可能ですか? それが不可能な場合: 代替手段は何ですか?
(ちなみに: 上記のコードでは、 クラスOperationFailure
とFileDoesNotExistError
は gcc 4.8 ではコンパイルされませんでしたが、clang 3.4 でコンパイルされました。明らかに、gcc は仮想ベースの継承コンストラクターを拒否します。誰がここにいるのかを知ることは興味深いでしょう。両方のコンパイラーがクラスOperationFailedBecauseFileDoesNotExistError
を拒否しました。継承するコンストラクターは直接のベースから継承しないためです。)