关闭

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

标签: namespacec++函数模版template编译
687人阅读 评论(0) 收藏 举报
分类:

                 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;
}

       这样运行是没有问题的,这里就不截图了。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38890次
    • 积分:718
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:0篇
    • 译文:0篇
    • 评论:16条
    文章存档
    最新评论