在看C++ Templates的时候发现有下面的一段代码。试图比较两个int指针所指的内容的大小:
错误原因是第六行返回的是一个int类型的值,而返回值要求的是一个指针,因此出现了将一个int类型转化为一个指针无效的错误。
仔细想想,其实上面的代码有很严重的问题,max调用的时候传递的是一个int*,即指向整型的指针。那么,第三行的T应该是什么类型呢?
如果也是int*,那么模板实例化后的函数参数就成了int**,即指向int型的指针的指针。这明显不是想要的。
但是,如果将模板的定义改为一般的不带指针的形式:
因此,唯一合理的解释就是对于两个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 }
不能通过编译。提示[将类型为‘int* const&’的引用初始化为类型为‘int’的表达式无效]。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类型的值,而返回值要求的是一个指针,因此出现了将一个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 }
编译器能很好的匹配主需要调用的模板,并实例化一个模板实例。需要注意的是第四行返回值已经不再是T*,而是T。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 }
这样,上面的代码就能正常执行,并得到正确的结果了。
总结:模板函数实例化时参数类型可以通过调用参数推导出来。对于调用参数为指针的情况,实例化后模板函数的参数应该是指针原型的类型。而非指针类型。
己下来,以备忘记。如果发现有不对的地方,渴望指正。