您的位置:首页 > 其它

函数模版template学习中的一个编译问题

2013-12-03 10:05 302 查看
c++学习函数模版的时候,写了一个交换函数的程序,函数为swap(),目的是交换两个数据。

源程序:

#include<iostream>
using namespace std;
template < class T >
void swap(T& x, T& y)
{
T t;
t = x;
x = y;
y = t;
}
int main()
{
int a = 1,b = 2;
double i = 1.1,j = 2.2;
char ch1 = 'A',ch2 = 'B';
swap(a,b);
swap(i,j);
swap(ch1,ch2);
cout<<a<<" "<<b<<endl;
cout<<i<<" "<<j<<endl;
cout<<ch1<<" "<<ch2<<endl;
return 0;
}


只见代码的话,语法什么的都是没有问题的。但是编译的时候却出现了六个错误!!



原因是什么呢?

原因是函数调用有歧义,也就是说swap函数在VC的STL已经是一个API函数。而且定义上面的定义一样,所以会发生歧义。最简单的解决方法当然是把函数名改了就行了,只要比如改成Two_swap()是没有问题的。当然如果已经写成这样的,不想改的话,可以添加,就是用自己的命名空间把函数包围起来,调用的时候再加上就可以了。

例如:

#include<iostream>
using namespace std;
namespace Test                //自定义命名空间将函数包围
{
template < class T >
void swap(T& x, T& y)
{
T t;
t = x;
x = y;
y = t;
}
using namespace Test;         //这行也必须有
}
int main()
{
int a = 1,b = 2;
double i = 1.1,j = 2.2;
char ch1 = 'A',ch2 = 'B';
Test::swap(a,b);          //注意调用的形式
Test::swap(i,j);
Test::swap(ch1,ch2);
cout<<a<<" "<<b<<endl;
cout<<i<<" "<<j<<endl;
cout<<ch1<<" "<<ch2<<endl;
return 0;
}


这样运行是没有问题的,这里就不截图了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐