模板函数中指针作为调用参数时模板参数的推导问题
来源:互联网 发布:ubuntu删除目录命令 编辑:程序博客网 时间:2024/05/17 20:28
在看C++ Templates的时候发现有下面的一段代码。试图比较两个int指针所指的内容的大小:
1 #include <iostream>
2
3 template<typename T>
4 inline T* const& max(T* const& a, T* const& b)
5 {
6 return *a < *b ? *b : *a;
7 }
8
9 int main()
10 {
11 int a = 7;
12 int b = 42;
13
14 int* p1 = &a;
15 int* p2 = &b;
16
17 std::cout<<"max(p1 , p2):"<<::max(p1 , p2)<<std::endl;
18
19 return 0;
20 }
2
3 template<typename T>
4 inline T* const& max(T* const& a, T* const& b)
5 {
6 return *a < *b ? *b : *a;
7 }
8
9 int main()
10 {
11 int a = 7;
12 int b = 42;
13
14 int* p1 = &a;
15 int* p2 = &b;
16
17 std::cout<<"max(p1 , p2):"<<::max(p1 , p2)<<std::endl;
18
19 return 0;
20 }
不能通过编译。提示[将类型为‘int* const&’的引用初始化为类型为‘int’的表达式无效]。
错误原因是第六行返回的是一个int类型的值,而返回值要求的是一个指针,因此出现了将一个int类型转化为一个指针无效的错误。
仔细想想,其实上面的代码有很严重的问题,max调用的时候传递的是一个int*,即指向整型的指针。那么,第三行的T应该是什么类型呢?
如果也是int*,那么模板实例化后的函数参数就成了int**,即指向int型的指针的指针。这明显不是想要的。
但是,如果将模板的定义改为一般的不带指针的形式:
1 template<typename T>
2 inline T const& max(T const& a, T const& b)
3 {
4 return a < b ? b : a;
5 }
2 inline T const& max(T const& a, T const& b)
3 {
4 return a < b ? b : a;
5 }
那么,在比较的时候将会是两个指针地址的比较。因此,这也不能达到目的。
因此,唯一合理的解释就是对于两个int指针作为函数参数的max模板,在调用的时候模板参数将实例化为int类型,而非int*类型。
为此,作一个验证,代码修改如下:
1 #include <iostream>
2
3 template<typename T>
4 inline T const& max(T* const& a, T* const& b)
5 {
6 return *a < *b ? *b : *a;
7 }
8
9 int main()
10 {
11 int a = 7;
12 int b = 42;
13
14 int* p1 = &a;
15 int* p2 = &b;
16
17 std::cout<<"max(p1 , p2):"<<::max(p1 , p2)<<std::endl;
18
19 return 0;
20 }
2
3 template<typename T>
4 inline T const& max(T* const& a, T* const& b)
5 {
6 return *a < *b ? *b : *a;
7 }
8
9 int main()
10 {
11 int a = 7;
12 int b = 42;
13
14 int* p1 = &a;
15 int* p2 = &b;
16
17 std::cout<<"max(p1 , p2):"<<::max(p1 , p2)<<std::endl;
18
19 return 0;
20 }
编译器能很好的匹配主需要调用的模板,并实例化一个模板实例。需要注意的是第四行返回值已经不再是T*,而是T。
这样,上面的代码就能正常执行,并得到正确的结果了。
总结:模板函数实例化时参数类型可以通过调用参数推导出来。对于调用参数为指针的情况,实例化后模板函数的参数应该是指针原型的类型。而非指针类型。
己下来,以备忘记。如果发现有不对的地方,渴望指正。
- 模板函数中指针作为调用参数时模板参数的推导问题
- 字符串参数的模板函数推导问题
- 函数指针作为模板函数的非模板参数
- 模板参数的推导
- C++函数模板的参数推导
- 函数模板的模板参数自动推导探究
- 函数指针模板参数
- 类模板作为函数参数
- 模板模板参数推导例子
- 模板参数推导
- 模板参数自动推导
- 模板参数 自变量推导
- 模板参数自动推导
- 函数模板中使用二维数组作为参数时的技巧
- 带有模板参数的函数指针
- 函数模板参数推导的两个经典应用
- C++——函数模板的参数推导
- C++——函数模板的参数推导
- SQL数据类型详细描述
- C++ Templates学习笔记之:函数模板
- New API HTTPMultiService and HTTPOperation in Flex 3.4
- 索爱的SDK:semc_java_me_cldc_sdk.2-5-0-3.exe,谁知道下载地址吗??
- 在ActionScript 3.0中使用CSS
- 模板函数中指针作为调用参数时模板参数的推导问题
- ORACLE 中ROWNUM用法总结
- Kernel中断处理模型
- DB2 数据库备份、恢复和前滚
- Oracle技巧
- 自己动手写一个简单的Shell之四:流程控制
- Hibernate学习笔记-----n+1问题
- Sql datetime 转化字符串
- 关键字volatile的用法