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

时间:2012-11-10 15:59:49

标签: 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;
}

但当我将功能名称从 交换 更改为 交换 时 它会产生一个错误

  

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

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

1 个答案:

答案 0 :(得分:10)

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

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