c++;模板函数重载 以下是“C++编程语言”< /P>的行 模板tsqrt(T); 模板复合物sqrt(复合物); 双sqrt(双); 空位f(复数z) { sqrt(2);//sqrt(int) sqrt(2.0);//sqrt(双精度) sqrt(z);//sqrt(复数) }
我不明白为什么sqrt(z);调用c++;模板函数重载 以下是“C++编程语言”< /P>的行 模板tsqrt(T); 模板复合物sqrt(复合物); 双sqrt(双); 空位f(复数z) { sqrt(2);//sqrt(int) sqrt(2.0);//sqrt(双精度) sqrt(z);//sqrt(复数) },c++,templates,C++,Templates,我不明白为什么sqrt(z);调用sqrt(complex)请任何人解释一下 作者说,, tsqrt比tsqrt更专业化,但是模板复合体sqrt(复合体)有一个单独的声明为什么不使用它?好吧,所使用的函数就是您所说的sqrt(complex)是模板模板complex sqrt(complex)的一个实例 您的误解在于模板实例的含义,而不是重载过程。事后看来,如果比亚恩将其写成 template<class T> T sqrt(T); template<class U> c
sqrt(complex)
请任何人解释一下
作者说,,
tsqrt
比tsqrt
更专业化,但是模板复合体sqrt(复合体)有一个单独的声明
为什么不使用它?好吧,所使用的函数就是您所说的sqrt(complex)
是模板模板complex sqrt(complex)
的一个实例
您的误解在于模板实例的含义,而不是重载过程。事后看来,如果比亚恩将其写成
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>)
}
模板tsqrt(T);
模板复合物sqrt(复合物);
双sqrt(双);
空位f(复数z)
{
sqrt(2);//sqrt(int)
sqrt(2.0);//sqrt(双精度)
sqrt(z);//sqrt(复数)
}
所以你不会被所有不同的t弄糊涂。但想法很简单;C++找到了最佳匹配。有三种可能的功能。前两个是完全匹配的(无需转换),因此忽略非模板版本。现在,我们有T=complex和U=double。选择哪个版本?比亚恩解释说,这里选择了第二个模板,因为它更专业。这意味着对于任何类型的U,都有一个类型
T=complex
,它使两个模板的签名相同。对不起,伙计们,我不明白sqrt(complex)代表complexsqrt
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>)
}