嵌套时(比如printVector<vector<int>>)中的“>>“的优化
在使用vectorint时本意是向模板中传入一个vectorint类型的参数但是编译器错误的将识别为右移运算符而不是模板参数表的结束。之前的解决方案是在中间添加空格 。C11优化了这一问题使得不添加空格也可以正确的编译。#include iostream #include vector using namespace std; templatetypename T class Base { public: void printVector(T t) { auto it t.begin(); for (; it ! t.end(); it) { cout *it ; } cout endl; } }; int main() { vectorint v{ 1,2,3,4,5,6,7,8,9 }; Basevectorint b; b.printVector(v); system(pause); return 0; }在c11之前会报errortest.cpp:25:20: error: should be within a nested template argument list Basevectorint b;根据错误提示中描述模板的两个右尖括之间需要添加空格这样写起来就非常的麻烦。C11改进了编译器的解析规则尽可能地将多个右尖括号解析成模板参数结束符方便我们编写模板相关的代码。上面的这段代码在支持C11的编译器中编译是没有任何问题的。方法的默认模板参数在c11之前类模板可以有默认的模板参数但是方法模板不支持有默认的模板参数。在C11中添加了对函数模板默认参数的支持。#include iostream #include typeinfo using namespace std; templatetypename T int, T t 520 //c11之前就 支持 类模板 默认的模板参数还定义了非类型参数t的默认值为520 class Test { public: void print() { cout current value: t endl; } }; templatetypename T1 int,typename T2 int void func(T1 val1 a, T2 val2 b) { cout val1: val1 ,val2: val2 endl; } int main() { Test t; t.print(); Testint, 1024 t2; t2.print(); cout endl; //------------------------------------------------------------- //自动推导根据传递的实参 func(a, b); //自动推导为 funcchar, char funcint(a, b); //显示的填了第一个模板参数第二个自动推导为char funcint, char func(1, 2); //推导为 funcint, int 且默认就是int func(1.1, 2.2); //推导为 funcdouble, double funcchar(a, b); //第一个显示填了char第二个自动推导为char funcchar, char funcint, char(a, b); //显示填了int, char funcint, char funcchar, int(a, b); //显示填了char, int funcchar, int func(); //默认为int funcint, int system(pause); return 0; }输出current value:520 current value:1024 val1: a,val2: b val1: 97,val2: b val1: 1,val2: 2 val1: 1.1,val2: 2.2 val1: a,val2: b val1: 97,val2: b val1: a,val2: 98 val1: 97,val2: 98