在调用函数’swap‘时出现函数调用不明确

为什么在调用模版的时候会显示函数调用不明确的错误

template<class t>
void swap(t&a,t&b){
    t temp=a;
    a=b;
    b=temp;
};
template<typename t>
void mySort(t arr[],int len){
    for(int i=0;iint max=i;
        for(int j=i+1;jif(arr[max]if(max!=i){
            swap<char>(arr[max], arr[i]);//Call to 'swap' is ambiguous             }
    }
};
template <class t>
void printArray(t arr[],int len){
    for(int i=0;i"";
    }
    cout<void test(){
    
    char charArr[]="asdfghjk";
    int num=sizeof(charArr)/sizeof(charArr[0]);
    mySort(charArr, num);
    printArray(charArr, num);
};
int main(){
    test();
    };

该回答引用ChatGPT

在这段代码中,函数调用不明确的错误是由于存在多个名为 swap 的函数。具体来说,C++ 中有两个 swap 函数的定义:一个是标准库中的 std::swap 函数,另一个是你自己定义的 swap 函数。

在调用 swap 函数时,编译器不知道应该调用哪一个函数,因为它们的参数和返回类型都相同。为了解决这个问题,你需要明确告诉编译器要调用哪一个函数。在这种情况下,你可以使用作用域解析运算符 :: 来指定要调用的函数。例如,如果你想调用自己定义的 swap 函数,可以这样写:

swap<char>(arr[max], arr[i]); // 调用你自己定义的 swap 函数

如果你想调用标准库中的 std::swap 函数,可以这样写:

std::swap(arr[max], arr[i]); // 调用标准库中的 swap 函数

另外,建议将自己定义的 swap 函数改名以避免与标准库中的函数冲突。例如,可以将它改为 mySwap。

在这个程序中,标准库中的std::swap和自定义的swap都被引入了当前的作用域中,因此在调用swap时就会出现函数调用不明确的错误。可以使用作用域限定符::指定使用哪个swap函数,如下所示:

if(max!=i){
    ::swap(arr[max], arr[i]);
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^