【问题标题】:c++ template function overloadingc++模板函数重载
【发布时间】:2010-09-18 02:08:23
【问题描述】:

以下是“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&lt;double&gt;(complex&lt;double&gt;) 任何机构请解释一下。

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

【问题讨论】:

  • 对不起,我不明白 sqrt(complex) 表示复杂sqrt>

标签: c++ templates


【解决方案1】:

事后看来,如果 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=complex 和 U=double。选择哪个版本? Bjarne 解释说这里选择了第二个模板,因为它更专业。这意味着对于任何类型 U,都有一个类型 T=complex&lt;U&gt; 使两个模板的签名相同。

【讨论】:

    【解决方案2】:

    嗯,使用的函数就是你所说的sqrt&lt;double&gt;(complex&lt;double&gt;) 是模板template &lt;class T&gt; complex&lt;T&gt; sqrt(complex&lt;T&gt;) 的一个实例。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      相关资源
      最近更新 更多