c++模板函数重载

c++ template function overloading

本文关键字:重载 函数 c++      更新时间:2023-10-16

下面是来自"c++编程语言"的行

template<class T > T sqrt(T );
template<class T > complex<T> sqrt(complex<T>);
double sqrt(double);
void f(complex<double> z )
{
s q r t (2 ); // sqrt<int>(int)
sqrt(2.0) ; // sqrt(double)
sqrt(z) ; // sqrt<double>(complex<double>)
}

我不明白为什么sqrt(z);呼叫sqrt<double>(complex<double>),请任何机构解释。

作者说,T sqrt<complex<T>>T sqrt <T>更专业,但template<class T > complex<T> sqrt(complex<T>);有一个单独的声明,为什么不使用它呢?

事后看来,如果Bjarne把它写成会更容易

template<class T> T sqrt(T);
template<class U> complex<U> sqrt(complex<U>);
double sqrt(double);
void f(complex<double> z )
{
    sqrt (2); // sqrt<int>(int)
    sqrt(2.0) ; // sqrt(double)
    sqrt(z) ; // sqrt<double>(complex<double>)
}

所以你不会被所有不同的t混淆。但这个想法很简单;C++找到最佳匹配。有三种可能的功能。前两个完全匹配(不需要转换),因此忽略非模板版本。现在,我们有T=复数和U=二重。选择了哪个版本?Bjarne解释说,这里选择第二个模板是因为它更专业。这意味着,对于任何类型U,都有一个类型T=complex<U>,它使两个模板的签名相同。

使用的函数就是您所说的sqrt<double>(complex<double>),它是模板template <class T> complex<T> sqrt(complex<T>)的一个实例。

您的误解在于模板实例的含义,而不是重载过程。