C++ c+中的模板类+;?

C++ c+中的模板类+;?,c++,templates,c++11,C++,Templates,C++11,我使用一个模板类来设置交换函数的数据类型。在代码中,如果我将函数名初始化为小写字母,它将抛出一个错误 调用重载的“swap”(double&,double&)是不明确的 但是,当我将函数名初始化为大写时,它可以正常工作。 如果有人能解释为什么会发生这种情况,我将不胜感激。这是我的密码 #include<iostream> using namespace std; template <class T> void swap(T &a,T &b) {

我使用一个模板类来设置交换函数的数据类型。在代码中,如果我将函数名初始化为小写字母,它将抛出一个错误
调用重载的“swap”(double&,double&)是不明确的
但是,当我将函数名初始化为大写时,它可以正常工作。 如果有人能解释为什么会发生这种情况,我将不胜感激。这是我的密码

#include<iostream>

using namespace std;
template <class T>
void swap(T &a,T &b)
{
    T temp;

    temp = a;
    a = b;
    b = temp;
}

int main()
{
    double value1 = 2.44;
    double value2 = 6.66;

    cout<<"\tBefore swap \n";
    cout<<"Value 1 = "<< value1 <<"\tValue 2 = " << value2 <<"\n";

    swap(value1,value2);

    cout<<"\tafter swap \n";
    cout<<"Value 1 = "<< value1 <<"\tValue 2 = "<<value2;
}
#包括
使用名称空间std;
样板
无效掉期(T&a、T&b)
{
温度;
温度=a;
a=b;
b=温度;
}
int main()
{
双值1=2.44;
双值2=6.66;

cout因为已经有一个标准库函数
std::swap
,所以您的编译器可能不喜欢它?您可以通过
使用名称空间std;

将其拉入,因为已经有一个标准库函数
std::swap
,所以您的编译器可能不喜欢它?您可以通过
使用名称空间p将其拉入ace std;

更改
swap
函数的名称,因为
std::swap
已存在

或者您可以将其放在一个单独的名称空间中,并使用范围解析运算符“::”,以将您的名称空间与标准名称空间区分开来

这是使用
命名空间std;
时发生的情况。您可能需要更具体地使用:

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

更改
swap
函数的名称,因为
std::swap
已存在

或者您可以将其放在一个单独的名称空间中,并使用范围解析运算符“::”,以将您的名称空间与标准名称空间区分开来

这是使用
命名空间std;
时发生的情况。您可能需要更具体地使用:

using std::cout;
using std::endl;
using std::cin;
而不是

swap(value1,value2);
使用

这将解决名称空间和歧义问题。

而不是

swap(value1,value2);
使用


这将解决名称空间和歧义问题。

标准库函数已使用模板“swap”而不是“swap”定义,它实际上位于std名称空间下,但由于您有一个using名称空间std行,因此它的存在没有std::前缀


如您所见,使用using namespace std并不总是一个好选项,因为可能会发生名称冲突,如本例中所示。通常,除非有真正的原因,否则最好不要使用using指令—名称空间的存在是有原因的—以防止名称冲突。

已经使用定义了标准库函数模板“swap”而不是“swap”,它实际上位于std名称空间下,但是因为您有一个using名称空间std行,所以它存在时没有std::前缀


如您所见,使用using namespace std并不总是一个好的选择,因为可能会发生名称冲突,如本例所示。一般来说,人们不应该使用using指令,除非有真正的原因-名称空间的存在是有原因的-以防止名称冲突。

还有另一个取消使用
名称空间的原因td
和在可能的情况下将自己的代码放在专用名称空间这是废除
使用名称空间std
并在可能的情况下将自己的代码放在专用名称空间的另一个原因
std::swap
的编写方式可以针对您自己的类型进行定制,但过程相当模糊如果您这样做了,只需使用
std::swap
std::swap
的编写方式可以针对您自己的类型进行自定义,但过程相当模糊。在这样做之后,请查看中的前两个答案,只需使用
std::swap