2015-04-19 18 views
6

Próbuję wydrukować nazwę typu za pomocą wyjątków, ale mój program nie wydaje się wychwycić wyjątku i zamiast tego wydaje się wywoływać funkcję domyślnego zakończenia. Co przeoczyłem?Dlaczego ten program nie może przechwycić wyjątku?

#include <cstdio> 
#include <exception> 
#include <typeinfo> 

namespace Error 
{ 
    template<typename T> 
    class Blah : std::exception 
    { 
     virtual const char* what() const throw() 
     { 
      return typeid(T).name(); 
     } 
    }; 
} 

void blah() { 
    throw Error::Blah<int*********>(); 
} 

int main() 
{ 
    try 
    { 
     blah(); 
    } 
    catch (std::exception& e) 
    { 
     std::puts(e.what()); 
    } 
} 

Odpowiedz

10

Problemem jest tutaj:

template<typename T> 
class Blah : std::exception 
//   ^^^^^^^^^^^^^^^ 

pan dziedziczy prywatnie (od class dziedziczenie jest private domyślnie i nie dodać specyfikator), więc nie jest std::exception dostępna baza. Musisz publicznie odziedziczyć.

Powiązane problemy