1 #include<iostream>
2 using namespace std;
3
4 //错误模板类
5 template<class T>
6 class error
7 {
8 T t;
9 public:
10 void showerror()
11 {
12 cout << typeid(T).name() << " show error";
13 }
14
15 };
16
17 //在模板类中可以抛出的错误
18 class myerror
19 {
20
21 };
22
23 template < class T >
24 class print3d
25 {
26 public:
27 print3d(T t);
28
29 class myerror1
30 {
31
32 };
33
34 template < class T >
35 class myerror2
36 {
37 if (t<1)
38 {
39 //抛出嵌套类的错误
40 //throw print3d<T>::myerror1();
41 //抛出内部类的模板对象(指定类型)
42 throw print3d<T>::myerror2<int>();
43 //抛出内部类的模板对象(不指定类型)
44 throw print3d<T>::myerror2<T>();
45 //抛出外部模板错误
46 //throw error<T>();
47 }
48 else if (t>100)
49 {
50 //throw error<T>();
51 //抛出一个外部错误
52 throw myerror();
53 }
54 };
55
56 };
57
58 //模板函数使用模板异常
59 template <class T>
60 void go()
61 {
62 try
63 {
64
65 print3d<T> my3d1(0);
66 }
67 catch (error<T> e)
68 {
69 e.showerror();
70 }
71 catch (print3d<T>::myerror2<T> e)
72 {
73
74 }
75 catch (print3d<T>::myerror2<int> e)
76 {
77
78 }
79 }
80
81
82 void main()
83 {
84 go<double>();
85 //try
86 //{
87 // //print3d<int> my3d1(0);
88 // print3d<char > my3d1(0);
89 //}
90 //catch (error<int> e)
91 //{
92 // e.showerror();
93 //}
94 //catch (error<char> e)
95 //{
96 // e.showerror();
97 //}
98 //模板与模板需要传递T参数
99 //常规引用模板必须实例化error<int>
100 //模板直接引用常规
101 // throw print3d<T>::myerror1() 类模板中嵌套类
102 //throw print3d<T>::myerror2<int>();
103 //throw print3d<T>::myerror2<T>(); 类模板中嵌套类模板
104 cin.get();
105 }