模板函数中指针作为调用参数时模板参数的推导问题

来源:互联网 发布: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 *< *? *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 }

那么,在比较的时候将会是两个指针地址的比较。因此,这也不能达到目的。

因此,唯一合理的解释就是对于两个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 *< *? *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。
这样,上面的代码就能正常执行,并得到正确的结果了。

总结:模板函数实例化时参数类型可以通过调用参数推导出来。对于调用参数为指针的情况,实例化后模板函数的参数应该是指针原型的类型。而非指针类型。
     己下来,以备忘记。如果发现有不对的地方,渴望指正。

原创粉丝点击