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
。因此,他的符号是正确的。或我完全误解了你的问题(不太可能)。谢谢丹,这也有帮助:)我接受了安东尼奥的回答,虽然在某些方面不太彻底,因为这让我赚了一分钱。