找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 2125|回复: 7

[求助]关于C++中的函数模板

[复制链接]
发表于 2009-11-2 06:14:30 | 显示全部楼层 |阅读模式 IP:江苏扬州
今天在编一个关于函数模板的程序时遇到了问题,编译环境为Dev-C++ 4.9.9.2和VC6

正常运行的程序:

#include <stdlib.h>
#include <iostream.h>
template <class T> void swap(T &,T &);
int main(int argc, char *argv[])
{
int a,b;
cout<<"请输入A的值:";
cin>>a;
cout<<"请输入B的值:";
cin>>b;
cout<<"A="<<a<<" B="<<b<<endl;
swap(a,b);
cout<<"After swap:"<<"A="<<a<<" B="<<b<<endl;
system("PAUSE");
return 0;
}
template <class T> void swap(T &i,T &j)
{
T t;
t=i;
i=j;
j=t;
cout<<"In swap:A="<<i<<" B="<<j<<endl;
}


无法正常运行的程序:

#include <cstdlib>
#include <iostream>
using namespace std;
template <class T> void swap(T &,T &);
int main(int argc, char *argv[])
{
int a,b;
cout<<"请输入A的值:";
cin>>a;
cout<<"请输入B的值:";
cin>>b;
cout<<"A="<<a<<" B="<<b<<endl;
swap(a,b);
cout<<"After swap:"<<"A="<<a<<" B="<<b<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
template <class T> void swap(T &i,T &j)
{
T t;
t=i;
i=j;
j=t;
cout<<"In swap:A="<<i<<" B="<<j<<endl;
}


我想问一下为什么后一种用ANSI C++标准的程序无法运行?如果可以运行,该怎样修改?
发表于 2009-11-2 06:14:37 | 显示全部楼层 IP:江苏扬州
以下是引用badly1984在2006-4-5 21:40:00的发言:

今天在编一个关于函数模板的程序时遇到了问题,编译环境为Dev-C++ 4.9.9.2和VC6

正常运行的程序:

#include <stdlib.h>
#include <iostream.h>
template <class T> void swap(T &,T &);
int main(int argc, char *argv[])
{
int a,b;
cout<<"请输入A的值:";
cin>>a;
cout<<"请输入B的值:";
cin>>b;
cout<<"A="<<a<<" B="<<b<<endl;
swap(a,b);
cout<<"After swap:"<<"A="<<a<<" B="<<b<<endl;
system("PAUSE");
return 0;
}
template <class T> void swap(T &i,T &j)
{
T t;
t=i;
i=j;
j=t;
cout<<"In swap:A="<<i<<" B="<<j<<endl;
}


无法正常运行的程序:

#include <cstdlib>
#include <iostream>
using namespace std;
//template <class T> void swap(T &,T &);//将这里的声明注释掉
int main(int argc, char *argv[])
{
int a,b;
cout<<"请输入A的值:";
cin>>a;
cout<<"请输入B的值:";
cin>>b;
cout<<"A="<<a<<" B="<<b<<endl;
swap(a,b);
cout<<"After swap:"<<"A="<<a<<" B="<<b<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
template <class T> void swap(T &i,T &j)
{
T t;
t=i;
i=j;
j=t;
cout<<"In swap:A="<<i<<" B="<<j<<endl;
}


我想问一下为什么后一种用ANSI C++标准的程序无法运行?如果可以运行,该怎样修改?
回复

使用道具 举报

发表于 2009-11-2 06:14:45 | 显示全部楼层 IP:江苏扬州
我试过了,如果用swap这个函数名会说:
d:\my program\test4\test4.cpp(53) : error C2667: 'swap' : none of 2 overload have a best conversion
d:\my program\test4\test4.cpp(53) : error C2668: 'swap' : ambiguous call to overloaded function
是跟系统函数构成了不合法的重载吗

我把函数名字改掉
报错:
D:\My Program\test4\test4.cpp(62) : error C2065: 'i' : undeclared identifier
D:\My Program\test4\test4.cpp(53) : see reference to function template instantiation 'void __cdecl _swap(int &,int &)' being compiled
D:\My Program\test4\test4.cpp(63) : error C2065: 'j' : undeclared identifier
D:\My Program\test4\test4.cpp(53) : see reference to function template instantiation 'void

然后在函数声明处,加上形参的名字就OK了,不知道为什么,请指教,不是说函数声明可以不带形参名称的没啊
回复

使用道具 举报

发表于 2009-11-2 06:14:51 | 显示全部楼层 IP:江苏扬州
你这个和标准库的swap冲突了,要么不要用using namespace std;

要么函数改个名字如 Swap()
回复

使用道具 举报

发表于 2009-11-2 06:14:58 | 显示全部楼层 IP:江苏扬州
但为什么模板函数在声明的时候不带形参名称编译时会在此函数定义部分引用形参的地方说标识符未声明
我在定义函数时,函数头里是写了形参名字的,不过形参的类型是个引用,但我把引用符号&去掉的话,编译时就不会有错误,斑竹请指教
回复

使用道具 举报

发表于 2009-11-2 06:15:06 | 显示全部楼层 IP:江苏扬州
以下是引用lululau在2006-4-6 13:25:00的发言:
但为什么模板函数在声明的时候不带形参名称编译时会在此函数定义部分引用形参的地方说标识符未声明
我在定义函数时,函数头里是写了形参名字的,不过形参的类型是个引用,但我把引用符号&去掉的话,编译时就不会有错误,斑竹请指教
形参声明的时候写不写形参名都行,你编译有错误并不是这个问题。
你把swap函数放到main函数前面就行了。
回复

使用道具 举报

发表于 2009-11-2 06:15:14 | 显示全部楼层 IP:江苏扬州
  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4. template <class T> void Swap(T &,T &);
  5. int main(int argc, char *argv[])
  6. {
  7. int a,b;
  8. cout<<"请输入A的值:";
  9. cin>>a;
  10. cout<<"请输入B的值:";
  11. cin>>b;
  12. cout<<"A="<<a<<" B="<<b<<endl;
  13. Swap(a,b);
  14. cout<<"After swap:"<<"A="<<a<<" B="<<b<<endl;
  15. system("PAUSE");
  16. return EXIT_SUCCESS;
  17. }
  18. template <class T> void Swap(T &i,T &j)
  19. {
  20. T t;
  21. t=i;
  22. i=j;
  23. j=t;
  24. cout<<"In swap:A="<<i<<" B="<<j<<endl;
  25. }
复制代码


我编译没问题,你把所有的函数名都改了吗.
回复

使用道具 举报

发表于 2009-11-2 06:15:21 | 显示全部楼层 IP:江苏扬州
2樓和4樓都是正解..................

一個是用庫中的swap,一個是用自定義的Swap...............

看起來,我居然不是最差的...........— —b,lululau同學還要繼續努力呀..........
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 03:19 , Processed in 0.228575 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表