File tree Expand file tree Collapse file tree 1 file changed +3
-3
lines changed Expand file tree Collapse file tree 1 file changed +3
-3
lines changed Original file line number Diff line number Diff line change @@ -452,12 +452,12 @@ float i = c_style_cast<int, float>(v);
452
452
453
453
嗯,很顺利的通过了。难道C++不能支持让参数推导一部分模板参数吗?
454
454
455
- 当然是可以的。只不过在部分推导、部分指定的情况下,编译器对模版参数的顺序是有限制的 :先写需要指定的模板参数,再把能推导出来的模板参数放在后面。
455
+ 当然是可以的。只不过在部分推导、部分指定的情况下,编译器对模板参数的顺序是有限制的 :先写需要指定的模板参数,再把能推导出来的模板参数放在后面。
456
456
457
457
在这个例子中,能推导出来的是 ` SrcT ` ,需要指定的是 ` DstT ` 。把函数模板写成下面这样就可以了:
458
458
459
459
``` C++
460
- template <typename DstT, typename SrcT> DstT c_style_cast (SrcT v) // 模版参数 DstT 需要人肉指定,放前面。
460
+ template <typename DstT, typename SrcT> DstT c_style_cast (SrcT v) // 模板参数 DstT 需要人肉指定,放前面。
461
461
{
462
462
return (DstT)(v);
463
463
}
@@ -1370,7 +1370,7 @@ template <typename T> foo(T& v0, C& v1){
1370
1370
1. 函数`foo`中的变量`v1`已经确定是`struct C`的实例,所以,`v1.a = 2;`会导致编译错误,`v1.c = 3;`是正确的代码;
1371
1371
2. 对于变量`v0`来说,这个问题就变得很微妙。如果`v0`是`struct A`或者`struct AB`的实例,那么`foo`中的语句`v0.a = 1;`就是正确的。如果是`struct C`,那么这段代码就是错误的。
1372
1372
1373
- 因此在模板定义的地方进行语义分析,并不能**完全**得出代码是正确或者错误的结论,只有到了实例化阶段,确定了模版参数的类型后 ,才知道这段代码正确与否。令人高兴的是,在这一问题上,我们和C++标准委员会的见地一致,说明我们的C++水平已经和Herb Sutter不分伯仲了。既然我们和Herb Sutter水平差不多,那凭什么人家就吃香喝辣?下面我们来选几条标准看看服不服:
1373
+ 因此在模板定义的地方进行语义分析,并不能**完全**得出代码是正确或者错误的结论,只有到了实例化阶段,确定了模板参数的类型后 ,才知道这段代码正确与否。令人高兴的是,在这一问题上,我们和C++标准委员会的见地一致,说明我们的C++水平已经和Herb Sutter不分伯仲了。既然我们和Herb Sutter水平差不多,那凭什么人家就吃香喝辣?下面我们来选几条标准看看服不服:
1374
1374
1375
1375
> **14.6 名称解析(Name resolution)**
1376
1376
You can’t perform that action at this time.
0 commit comments