Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;模板函数重载 以下是“C++编程语言”< /P>的行 模板tsqrt(T); 模板复合物sqrt(复合物); 双sqrt(双); 空位f(复数z) { sqrt(2);//sqrt(int) sqrt(2.0);//sqrt(双精度) sqrt(z);//sqrt(复数) }_C++_Templates - Fatal编程技术网

c++;模板函数重载 以下是“C++编程语言”< /P>的行 模板tsqrt(T); 模板复合物sqrt(复合物); 双sqrt(双); 空位f(复数z) { sqrt(2);//sqrt(int) sqrt(2.0);//sqrt(双精度) sqrt(z);//sqrt(复数) }

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(z);调用
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>)
}