重载调用函数()一般再什么情况下用、什么地方用、用它的好处? 书上讲的是在veator里用.
2个回答
展开全部
滥用using namespace std的后果。
随便引入命名空间虽然可以简化代码编写,但是会造成命名空间污染,从而有冲突的风险。
你这个问题的本质很简单,std命名空间中原来就有一个函数名叫swap,因为它放在std命名空间内,本来是不干扰你的程序的。
但是你通过using namespace std引入了std命名空间,而你自己恰恰也定义了一个swap,两个函数名字相同。结果就造成函数名字冲突了。编译器看到两个同名、同参数定义的泛型函数,无法决定该调用哪一个,于是就报错。
解决方法有两种,要么去掉using namespace std;,然后把cout改为std::cout,endl改为std::endl,像这样:
#include<iostream>
template <typename Any>
void swap(Any &a,Any &b);
int main()
{
int i=1;
int j=2;
swap(i, j);
std::cout<<i<<j<<std::endl;
return 0;
}
template <typename Any>
void swap(Any &a,Any &b)
{
Any temp;
temp=a;
a=b;
b=temp;
}
要么就自己另外建立一个命名空间(比如myspace),然后把你自己写的那个函数扔进去,像这样:
#include<iostream>
using namespace std;
namespace myspace
{
template <typename Any>
void swap(Any &a,Any &b)
{
Any temp;
temp=a;
a=b;
b=temp;
}
}
int main()
{
int i=1;
int j=2;
myspace::swap(i, j); //指明调用自己写的swap
cout<<i<<j<<endl;
return 0;
}
这样就不会冲突了。
随便引入命名空间虽然可以简化代码编写,但是会造成命名空间污染,从而有冲突的风险。
你这个问题的本质很简单,std命名空间中原来就有一个函数名叫swap,因为它放在std命名空间内,本来是不干扰你的程序的。
但是你通过using namespace std引入了std命名空间,而你自己恰恰也定义了一个swap,两个函数名字相同。结果就造成函数名字冲突了。编译器看到两个同名、同参数定义的泛型函数,无法决定该调用哪一个,于是就报错。
解决方法有两种,要么去掉using namespace std;,然后把cout改为std::cout,endl改为std::endl,像这样:
#include<iostream>
template <typename Any>
void swap(Any &a,Any &b);
int main()
{
int i=1;
int j=2;
swap(i, j);
std::cout<<i<<j<<std::endl;
return 0;
}
template <typename Any>
void swap(Any &a,Any &b)
{
Any temp;
temp=a;
a=b;
b=temp;
}
要么就自己另外建立一个命名空间(比如myspace),然后把你自己写的那个函数扔进去,像这样:
#include<iostream>
using namespace std;
namespace myspace
{
template <typename Any>
void swap(Any &a,Any &b)
{
Any temp;
temp=a;
a=b;
b=temp;
}
}
int main()
{
int i=1;
int j=2;
myspace::swap(i, j); //指明调用自己写的swap
cout<<i<<j<<endl;
return 0;
}
这样就不会冲突了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询