码迷,mamicode.com
首页 > 编程语言 > 详细

C++模板编程 - 第二章 - 函数模板

时间:2015-06-15 23:26:49      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

模板被编译两次

书上说模板被编译两次:一次是实例化之前,检查模板代码本身,这个好理解,就是检查和模板没有关系的代码;第二次编译是在实例化的时候,看看把类型带入进去有没有问题,比如说字符串没有除法。

还有一个需要注意的问题:模板在进行实例化的时候,编译器要能够看到模板的定义。下面的代码会挂掉,因为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

C++模板编程 - 第二章 - 函数模板

标签:

原文地址:http://www.cnblogs.com/ch3cooh/p/cpp_template_ch2.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!