在看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。
这样,上面的代码就能正常执行,并得到正确的结果了。
总结:模板函数实例化时参数类型可以通过调用参数推导出来。对于调用参数为指针的情况,实例化后模板函数的参数应该是指针原型的类型。而非指针类型。
己下来,以备忘记。如果发现有不对的地方,渴望指正。