如果我将函数命名为`swap`,为什么会出现模板错误,但是`Swap`是否合适?

Nas*_*ail 5 c++ templates

好吧,这样的程序和工作绝对正确

#include <iostream>

using namespace std;

template <typename T>
void Swap(T &a , T &b);

int main(){

    int i = 10;
    int j = 20;

    cout<<"i, j = " << i <<" , " <<j<<endl;
    Swap(i,j);
    cout<<"i, j = " << i <<" , " <<j<<endl;


}
template <typename T>
void Swap(T &a , T &b){
    T temp;
    temp = a ;
    a = b;
    b= temp;
}
Run Code Online (Sandbox Code Playgroud)

但是当我将函数的名称从Swap更改为swap时 会产生错误说明

错误:重载'swap(int&,int&)'的调用是不明确的 注意:候选者是:void swap(T&,T&)[与T = int] | || ===构建完成:1个错误,0个警告=== |

发生了什么事情是使用模板以大写字母开头来启动函数的规则?

zxc*_*cdw 10

这是因为已经存在一个名为的函数swap.它实际上在std命名空间下,但因为你有using namespace std一行,所以它没有std::前缀.

如您所见,using namespace std由于可能的名称冲突,使用它并不总是一个好的选择,如本例所示.一般情况下,我们不应该使用该using指令,除非有一个真正的原因 - 名称空间存在是有原因的 - 以防止名称冲突.