您的位置:首页 > 其它

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

2009-09-04 09:43 609 查看
在看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
}

不能通过编译。提示[将类型为‘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

*
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。

这样,上面的代码就能正常执行,并得到正确的结果了。

总结:模板函数实例化时参数类型可以通过调用参数推导出来。对于调用参数为指针的情况,实例化后模板函数的参数应该是指针原型的类型。而非指针类型。

己下来,以备忘记。如果发现有不对的地方,渴望指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: