c++模板函数重载
c++ template function overloading
下面是来自"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>)
的一个实例。
您的误解在于模板实例的含义,而不是重载过程。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?