Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2003-08-21 09:55:00

Something I've been meaning to add to more/error_handling.html since
last fall was just added:

  Use virtual inheritance. This insight is due to Andrew Koenig. Using
  virtual inheritance from your exception's base class(es) prevents
  ambiguity problems at the catch-site in case someone throws an
  exception derived from multiple bases which have a base class in

  #include <iostream>
  struct my_exc1 : std::exception { char const* what() throw(); };
  struct my_exc2 : std::exception { char const* what() throw(); };
  struct your_exc3 : my_exc1, my_exc2 {};

  int main()
     try { throw your_exc3(); }
     catch(std::exception const& e) {}
     catch(...) { std::cout << "whoops!" << std::endl; }

  The program above prints "whoops" because the C++ runtime can't
  resolve which exception instance to match in the first catch

boost::filesystem::filesystem_error (possibly among others) ought to
be updated to follow this guideline IMO.

BTW, isn't "filesystem::filesystem_error" a little redundant? Anyone
        typedef filesystem_error error;


Dave Abrahams
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at