注册 登录
编程论坛 C++教室

这个函数模板怎么不能用?

thanatus 发布于 2008-09-20 22:58, 1847 次点击
这个是定义的一个函数模板,利用模板交换了两个整数a和b,但是编译不能通过,用的是dev-c++编译器,
编译提示:call of overloaded `swap(int&, int&)' is ambiguous ,请问这是为什么啊?

#include <iostream>

template <class any>

void swap(any &, any &);

int main()
{
    using namespace std;
   
    int a=3, b=4;
   
    cout<<"a="<<a<<" "<<"b="<<b<<endl;
   
    swap (a,b);
   
    cout<<"a="<<a<<" "<<"b="<<b<<endl;
   
    system("pause");
   
    return 0;
}

template <class any>
void swap (any &x, any &y)
{
     any temp;
     temp = x;
     x = y;
     y = temp;
     
}
14 回复
#2
守鹤2008-09-20 23:03
template <class any> 是一个类模板的

使用函数模板是 template <typename any>
#3
sunkaidong2008-09-20 23:11
你和标准库里面的函数冲突了。。换个名字
#include <iostream>

template <class any>

void swap1(any &, any &);

int main(void)
{
    using namespace std;
   
    int a=3, b=4;
   
    cout<<"a="<<a<<" "<<"b="<<b<<endl;
   
    swap1(a,b);
   
    cout<<"a="<<a<<" "<<"b="<<b<<endl;
   
    system("pause");
   
    return 0;
}

template <class any>
void swap1 (any &x, any &y)
{
     any temp;
     temp = x;
     x = y;
     y = temp;
     
}
#4
thanatus2008-09-20 23:12
我改过,没有用,不信你编译一下,确实可以用typename替换class,但我考虑了以后也许需要向后兼容,所以这里我用了class,再说整数类int,浮点类float本身也可以看作一个数据类,我用class也没有问题啊~
#5
thanatus2008-09-20 23:15
回复三楼,可以编译了~结果没有问题~多谢,我初学,但是我有很多问题不懂,以后向你多请教哈~
但是我以前也声明过swap函数(自己定义的,比如我利用指针交换两个数的时候),为什么那时候不报错啊?
这里的标准库是那个库?

[[it] 本帖最后由 thanatus 于 2008-9-20 23:16 编辑 [/it]]
#6
守鹤2008-09-20 23:19
调用时,改成<int>swap1(a,b);试一下  我这没有那个VC环境
template<typename  r>也可以对多种类型的数据进行操作
#7
thanatus2008-09-20 23:39
[bo][un]守鹤[/un] 在 2008-9-20 23:19 的发言:[/bo]

调用时,改成swap1(a,b);试一下  我这没有那个VC环境
template也可以对多种类型的数据进行操作


改成swap1没有问题,我确实冲突了,改成int我刚才发帖之前试过,也没有用,
只有把swap改成swap1,但是我以前也给函数起过swap的名字呀~怎么这个时候不行了~唉~
#8
ma35872008-09-21 10:23
[bo][un]thanatus[/un] 在 2008-9-20 23:39 的发言:[/bo]



改成swap1没有问题,我确实冲突了,改成int我刚才发帖之前试过,也没有用,
只有把swap改成swap1,但是我以前也给函数起过swap的名字呀~怎么这个时候不行了~唉~


可能你以前没有用 using namespace std;
#9
gaoce2272008-09-21 23:26
回复 1# thanatus 的帖子
请问,system()是什么意思?
#10
zzt_4282008-10-03 10:18
模板的尖括号中用class any是对的.这是老式用法,typename 在C++演进过程中中靠后,也是对的.还是我师兄说的对.是和名字空间std中的函数名冲突了.
#11
ml2325282008-10-03 12:19
函数名冲突
3楼正解
#12
lwf9022008-11-18 19:10
为什么这个函数模板出错?
#include "stdafx.h"
#include<iostream>
using namespace std;

template<typename T>
void swap(T& a,T& b)
{T z;
z=a;a=b;b=z;
}

int _tmain(int argc, _TCHAR* argv[])
{   double x1=1.243;
    double x2=2.1236;
    swap(x1,x2);
    cout<<"x2="<<x2<<"  "<<"x1="<<x1<<endl;
    return 0;
}

这是我在VC++2005中测试的一个有关交换数据的函数模板程序,但总是调不出来,也不知错在哪了,请高手指点一下,多谢多谢
#13
lwf9022008-11-18 19:12
回复 11# 的帖子
但是我将 T 改成double 后能用啊!
#14
lwf9022008-11-18 19:31
很奇怪,不知这个程序哪出错了?
这是一道关于求两数最大公约数与最小公倍数最笨的但最易想到的方法,编译通过了,但当输入两个不能整除的数时(如8,12),不能得出正确结果,请教大家错误出在哪了?
#include "stdafx.h"
#include<iostream>
using namespace std;

int fun1(int i,int j)
{
  int temp;
  if(i<j)
   {temp =j;j=i;i=temp;};
 int k;
 for(k=j;k>1;j--)
   {if ((i%k==0)&&(j%k==0))
     return k;}
 return 1;    
}                           //错误很可能出在这里了,但不知怎么改
int _tmain(int argc, _TCHAR* argv[])
{cout<<"enter two number:";
 int x,y;
 cin>>x>>y;
 cout<<"最大公约数是:"<<fun1(x,y)<<endl;
 cout<<"最小公倍数是:"<<x*y/fun1(x,y);
    return 0;
}
#15
lwf9022008-11-18 19:35
不好意思,初来乍到,搞错了
请主人谅解,我是新手,本来是要别人帮我解惑的,可竟然将问题提到了你的回复你去了,不好意思了,搞错了.
1