标签:
模板被编译两次
书上说模板被编译两次:一次是实例化之前,检查模板代码本身,这个好理解,就是检查和模板没有关系的代码;第二次编译是在实例化的时候,看看把类型带入进去有没有问题,比如说字符串没有除法。
还有一个需要注意的问题:模板在进行实例化的时候,编译器要能够看到模板的定义。下面的代码会挂掉,因为main.cpp把max.h包含进来,但是其中没有max的实现
1 // max.h 2 template<typename T> 3 max..... 4 5 // max.cpp 6 #include "max.h" 7 ..... 8 9 //main.cpp 10 #include "max.h" 11 12 int main() 13 { 14 max(1,2); 15 ... 16 }
返回类型作为一个参数
编译器在进行模板实例化的时候是不能根据返回值的类型推断用怎么实例化的。
1 template<typename T1, typename T2> 2 T1 convert(const T2 & in) { return static_cast<T1>(in); } 3 4 convert<double, int>(123.lf); // good 5 convert(123); // Noooooo!
非模板函数优先
手工制造的(非模板函数)和模子刻出来的(模板函数)比,手工制造的优先。
1 #include<iostream> 2 3 using std::cout; 4 using std::endl; 5 6 int max(int a, int b) 7 { 8 cout << "int max(int, int) is called." << endl; 9 return a > b ? a : b; 10 } 11 12 template<typename T> 13 T max(const T & a, const T & b) 14 { 15 cout << "template<typename T> T max(const T &, const T &) is called." << endl; 16 return a > b ? a : b; 17 } 18 19 int main() 20 { 21 cout << max(1, 2) << endl; // non-parametric max 22 cout << max<>(1, 2) << endl; // parametric max 23 24 return 0; 25 }
今天先这个样子,滚去看数理方程了。
@2015/6/15
标签:
原文地址:http://www.cnblogs.com/ch3cooh/p/cpp_template_ch2.html