关于使用函数模板的问题.
#include <iostream>
using namespace std;
template<typename T>
void swap(T &a,T &b)
{
T temp;
temp = a;
a = b;
b =temp;
}
void main()
{
int a =5, b= 8;
swap(a,b);
cout << a << " "<<b;
}
error C2667: 'swap' : none of 2 overload have a best conversion
error C2668: 'swap' : ambiguous call to overloaded function
因为库函数中有'swap'函数,所以出现如上错误!
如果把程序改为如下普通的函数形式,为什么不会出现错误呢?
#include <iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp;
temp = a;
a = b;
b =temp;
}
void main()
{
int a =5, b= 8;
swap(a,b);
cout << a << " "<<b;
}
函数与模板对函数名称有哪些规定?
[解决办法]
加上::swap(a,b);和std的swap冲突了
[解决办法]
加上双冒号告诉编译器使用你自己定义的swap函数,具体google C++名称查询
[解决办法]
这样改
namespace A{ template<typename T>void swap(T &a,T &b){ T temp; temp = a; a = b; b =temp; } }void main(){ int a =5, b= 8; A::swap(a,b); cout << a << " "<<b;}
[解决办法]
那是因为库中就是如下这样下的
template <class T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
你自己定义一个swap那只是特化了一个swap
但是你再写一个swap模板就不行了
[解决办法]
#include <iostream>using namespace std;template<typename T>void swap(T &a,T &b){ T temp; temp = a; a = b; b =temp; } void main(){ int a =5, b= 8; ::swap(a,b); // 这么一下就OK了 cout << a << " "<<b;}
[解决办法]
[Quote=引用:]
#include <iostream>
using namespace std;
template<typename T>
void swap(T &a,T &b)
{
T temp;
temp = a;
a = b;
b =temp;
}
void main()
{
int a =5, b= 8;
swap(a,b);……
[/Quote]
是由于STL中也有一个SWAP造成的,两者重载了。第一段代码出错的原因是两者都解析为int且都为模板,所以产生二义。第二段虽然也解析为int,但你定义的swap是普通函数,普通函数在重载解析中是优先于模板的,所以不是二义。