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

原创 2013年12月03日 10:05:20

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

template学习之零值初始化及字符串常量作(function template argument)函数模版参数问题

本篇只是摘抄自《c++ template》小问题比较少注意,而且也容易忘记 1 零值初始化 对于基本的数据类型int,double,pointer type来说,一般没有default构造式对其初始化...

C++template--函数模版

//max.hpp template inline T const& max(T const &a,T const &b) { return a>b?a:b; } template inlin...

关于postGIS没有template_postgis模版的问题解决

template_postgis模版是创建空间数据库的必要手段,没有这个模版没办法导入shp文件。 解决办法: 打开psql(用开始菜单中搜索即可搜到,或者进入pgAdmin的插件菜单下的...

template类模版实例化易出现的问题

在用Xcode写C++时,当使用了模版类,可能会出现发现子类找不到基类的成员,如图 此处的Search_tree继承自Binary_tree root指针为基类Binary_tree的成员...
  • Nora07
  • Nora07
  • 2017年06月11日 19:00
  • 75

c++ template模版学习

1. 模板的概念。 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX(...

c++ 模版函数的定义和实现必须放在一个文件中

今天使用模版函数,遇到一个问题。 当我定义一个类,并且将它的一个成员函数定义为模版类型时,需要将该模版函数的实现与该类放在一个文件中。 比如在a.h中定义了class a: ...

C++ - 函数模板(function template) 的 推进(forward) 问题 及 解决

函数模板(function template) 的 推进(forward) 问题 及 解决 本文地址: http://blog.csdn.net/caroline_wendy/article/de...

c++ 模版函数的定义和实现放在一个文件中

今天使用模版函数,遇到一个问题。 当我定义一个类,并且将它的一个成员函数定义为模版类型时,需要将该模版函数的实现与该类放在一个文件中。 比如在a.h中定义了class a: class a ...

c++ 模版函数的定义和实现放在一个文件中 .

今天使用模版函数,遇到一个问题。 当我定义一个类,并且将它的一个成员函数定义为模版类型时,需要将该模版函数的实现与该类放在一个文件中。 比如在a.h中定义了class a: [htm...
  • zhubosa
  • zhubosa
  • 2012年07月12日 13:55
  • 442

C++学习笔记36 模版的显式具体化(template specialization)和显式实例化(template instantiation)

C++的模版有时候很可能无法处理某些类型。 例如: #include using namespace std; class man{ private: string name; int data...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数模版template学习中的一个编译问题
举报原因:
原因补充:

(最多只允许输入30个字)