2015-04-19 21 views
6

Tôi đang cố gắng in tên loại bằng cách sử dụng ngoại lệ, nhưng chương trình của tôi thậm chí không có vẻ để bắt ngoại lệ và thay vào đó dường như gọi hàm kết thúc mặc định. Tôi đã bỏ lỡ điều gì?Tại sao chương trình này không bắt được ngoại lệ?

#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()); 
    } 
} 

Trả lời

10

Vấn đề là ở đây:

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

Bạn đang kế thừa nhân (kể từ class thừa kế là private theo mặc định và bạn không thêm một specifier), do đó không phải là một std::exception cơ sở có thể truy cập. Bạn phải kế thừa công khai.

Các vấn đề liên quan