首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于使用函数模板的有关问题

2012-03-09 
关于使用函数模板的问题.#include iostreamusing namespace stdtemplatetypename Tvoid swap(T &a,T

关于使用函数模板的问题.
#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++名称查询
[解决办法]
这样改

C/C++ code
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模板就不行了
[解决办法]
C/C++ code
#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 &amp;a,T &amp;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是普通函数,普通函数在重载解析中是优先于模板的,所以不是二义。

热点排行