---- 整理自狄泰软件唐佐林老师课程
1. 写法一
下面的程序想要表达什么意思?
 
 
1.1 历史原因
早期的C++直接复用class关键字来定义模板
 但是泛型编程针对的不只是类类型
 class关键字的复用使得代码出现二义性
1.2 typename诞生的直接诱因
自定义类类型内部的嵌套类型
 不同类中的同一个标识符可能导致二义性
 编译器无法辨识标识符究竟是什么
1.3 编程实验:模板中的二义性

 
- typename的作用: 
  
- 在模板定义中 声明泛指类型
 - 明确告诉编译器其后的标识符为 类型
 
 
2. 写法二
下面的程序想要表达什么意思?
 
- try catch用于分隔正常功能代码与异常处理代码
 - try catch可以直接将函数实现分隔为2部分
 - 函数声明和定义时可以直接 指定可能抛出的异常类型
 - 异常声明成为函数的一部分可以提高代码可读性
 
2.1 函数异常声明 的注意事项
- 函数异常声明是一种与编译器之间的契约
 - 函数声明异常后就只能抛出声明的异常 
  
- 抛出其它异常将导致程序运行终止
 - 可以直接通过异常声明定义无异常函数
 
 
2.2 编程实验:新的异常写法
#include <iostream>
#include <string>
using namespace std;
int func(int i, int j) throw(int, char)
{
    if( (0 < j) && (j < 10) )
    {
        return (i + j);
    }
    else
    {
        throw '0';
    }
}
void test(int i) try
{
    cout << "func(i, i) = " << func(i, i) << endl;
}
catch(int i)
{
    cout << "Exception: " << i << endl;
}
catch(...)
{
    cout << "Exception..." << endl;
}
int main(int argc, char *argv[])
{
    test(5);
    
    test(10);
    
    return 0;
}
 

 
3. 小结
- class可以用来在模板种定义泛指类型(不推荐)
 - typename是可以消除模板中的二义性的
 - try catch可以将函数体分成两部分
 - 函数异常声明能够提高程序的可读性
 


















