c++模板重载

C++ template overloading

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

我正在学习超载。我的代码有什么问题?这是错误信息In instantiation of ‘const _Tp& std::max(const _Tp&, const _Tp&, _Compare) [with _Tp = double; _Compare = double]’:/usr/include/c++/4.8/bits/stl_algobase.h:263:26: error: ' __comp '不能作为函数使用If (__comp(__a, __b))

    #include<iostream>
using namespace std;
template <typename T1, typename T2, typename T3> T1 max(T1,T2,T3);
template <typename T1, typename T2> T1 max(T1,T2);
template <typename T1, typename T2>
T1 max(T1 x, T2 y){
 return x+y;
}
template <typename T1, typename T2, typename T3>
T1 max(T1 x, T2 y, T3 z){
 return x+y+z;
}
int main()
{
        cout << max(1.2,2.3,3.4) << endl;
        cout << max(1,2) << endl;
}

来自编译器的错误消息清楚地表明编译器正在使用std::max而不是文件中定义的函数。这是避免使用

的又一个原因。
using namespace std;

修复你的问题:

  1. 删除该行
  2. 使用std::coutstd::endl代替coutendl。如果您想继续使用coutendl,请添加

    using std::cout;
    using std::endl;
    

另一个解决方案是完全指定应该调用哪个max(即std中的那个还是这个文件中的那个?):

#include <iostream>
using namespace std;
template <typename T1, typename T2, typename T3> T1 max(T1,T2,T3);
template <typename T1, typename T2> T1 max(T1,T2);
template <typename T1, typename T2>
T1 max(T1 x, T2 y){
 return x+y;
}
template <typename T1, typename T2, typename T3>
T1 max(T1 x, T2 y, T3 z){
 return x+y+z;
}
int main()
{
        cout << ::max(1.2,2.3,3.4) << endl;
        cout << ::max(1,2) << endl;
}

这里使用::max向编译器表示您希望从根命名空间中获得max。

通常,如果可以避免,我不推荐这种解决方案,但这可能会派上用场。

见https://ideone.com/PWxDT7