C++ 函数模板重载:Stroustrup示例理解
我已经浏览了一些与此标题相同的帖子,但找不到任何有助于我解决此问题的内容C++ 函数模板重载:Stroustrup示例理解,c++,C++,我已经浏览了一些与此标题相同的帖子,但找不到任何有助于我解决此问题的内容 下面是一个扫描的例子,从“C++编程语言”,第二版,B Stroustrup,第133.2页(第336页)。 我不理解第三个sqrt(z)重载解析。我原以为解决方案是sqrt(complex) Obv功能double sqrt(double)不符合要求。但我也认为templatetsqrt(T)不能解析为sqrt(complex),因为在我看来这似乎意味着T有两种不同的分辨率,我认为它不能T在其“范围”中必须是同一事物
下面是一个扫描的例子,从“C++编程语言”,第二版,B Stroustrup,第133.2页(第336页)。
我不理解第三个sqrt(z)
重载解析。我原以为解决方案是sqrt(complex)
Obv功能double sqrt(double)
不符合要求。但我也认为templatetsqrt(T)
不能解析为sqrt(complex)
,因为在我看来这似乎意味着T
有两种不同的分辨率,我认为它不能T
在其“范围”中必须是同一事物
我有什么误解,你能指出吗?:)谢谢 第二个是一个符合要求的特殊化。参数为T,即中的类型
complex<T>
复杂
那么函数是
sqrt<double>
sqrt
请记住,编译器选择最特殊的模板函数。在本例中,正如您所发现的,有两种可能的方法将签名与模板匹配。可以匹配第一个模板
模板tsqrt(T)
。使T
等于complex
生成一个带有签名complex sqrt(complex)
的函数(模板专门化)
第二个模板模板复合体sqrt(complex)
也可以匹配。在这种情况下,将T
设置为double
将使用与第一个模板的专门化相同的签名进行专门化
模板重载解析选择更专业的模板:在本例中,仅适用于复杂
的模板。如果这有助于更容易理解,您可以将T
重命名为第二个模板中的其他内容:模板如下:
template<class T> T sqrt(T);
template<class U> complex<U> sqrt(complex<U>);
模板tsqrt(T);
模板复合物sqrt(复合物);
这样,更容易看出两个函数模板中的模板参数是不相关的。您可以通过对
T
的适当选择或对U
的适当选择来获得complex
,第二个模板更专业。仔细查看decl。模板参数(T
)中的类型与参数类型(complex
)之间存在差异。后者从前者中提取出它的T
。因此,他的符号是正确的。或我完全误解了你的问题(不太可能)。谢谢丹,这也有帮助:)我接受了安东尼奥的回答,虽然在某些方面不太彻底,因为这让我赚了一分钱。