函数模版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)中typename的使用方法

声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(depen...
  • darennet
  • darennet
  • 2014年11月09日 16:10
  • 18257

C++基础——关于模板的技巧性基础知识(typename、成员模板、模板的模板参数)

关键字typename的另一种用法 将成员函数和嵌套类也定义成模板 模板的模板参数(template template parameters)...
  • lanchunhui
  • lanchunhui
  • 2015年11月05日 10:41
  • 1214

[数据结构]栈之链式栈的类模板实现

栈的抽象基类的实现:(不用抽象基类也是可以的,为了使用虚函数方便) #ifndef STACK #define STACK //栈的抽象基类 template class Stack { ...
  • u013467442
  • u013467442
  • 2015年06月22日 11:18
  • 1160

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

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

C++template--函数模版

//max.hpp template inline T const& max(T const &a,T const &b) { return a>b?a:b; } template inlin...
  • lanzhihui_10086
  • lanzhihui_10086
  • 2014年08月31日 14:07
  • 536

PHPCMS模版解析之TEMPLATE函数

昨天跟到了phpcms系统初始化到控制器流程 今天阿唐屌丝带大家一起分析phpcms模版机制 控制器 在进行一些 逻辑操作后 就开始渲染 视图显示 用到 template函数 所以要搞清phpcm...
  • jsbba
  • jsbba
  • 2014年05月02日 00:26
  • 2485

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

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

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

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

c++ template模版学习

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

Class template basic_ptree(模版类里再混有模版函数)

Class template basic_ptree boost::property_tree::basic_ptree //模版类里再混有模版函数 Synopsis ...
  • haiross
  • haiross
  • 2016年03月09日 14:00
  • 257
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数模版template学习中的一个编译问题
举报原因:
原因补充:

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