| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 861 人关注过本帖
标题:[求助]关于C++中的函数模板
只看楼主 加入收藏
badly1984
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-3-9
收藏
 问题点数:0 回复次数:7 
[求助]关于C++中的函数模板

今天在编一个关于函数模板的程序时遇到了问题,编译环境为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++标准的程序无法运行?如果可以运行,该怎样修改?

[此贴子已经被作者于2006-4-5 21:47:45编辑过]

搜索更多相关主题的帖子: 函数 模板 
2006-04-05 21:40
名人
Rank: 1
等 级:新手上路
威 望:1
帖 子:205
专家分:0
注 册:2006-3-3
收藏
得分:0 
以下是引用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++标准的程序无法运行?如果可以运行,该怎样修改?


未必钱多乐便多,财多累己招烦恼。 清贫乐道真自在,无牵无挂乐逍遥。
2006-04-06 10:59
lululau
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-12-13
收藏
得分:0 

我试过了,如果用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了,不知道为什么,请指教,不是说函数声明可以不带形参名称的没啊


好好学习 天天向上
2006-04-06 11:33
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

你这个和标准库的swap冲突了,要么不要用using namespace std;

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


2006-04-06 12:30
lululau
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-12-13
收藏
得分:0 
但为什么模板函数在声明的时候不带形参名称编译时会在此函数定义部分引用形参的地方说标识符未声明
我在定义函数时,函数头里是写了形参名字的,不过形参的类型是个引用,但我把引用符号&去掉的话,编译时就不会有错误,斑竹请指教

好好学习 天天向上
2006-04-06 13:25
名人
Rank: 1
等 级:新手上路
威 望:1
帖 子:205
专家分:0
注 册:2006-3-3
收藏
得分:0 
以下是引用lululau在2006-4-6 13:25:00的发言:
但为什么模板函数在声明的时候不带形参名称编译时会在此函数定义部分引用形参的地方说标识符未声明
我在定义函数时,函数头里是写了形参名字的,不过形参的类型是个引用,但我把引用符号&去掉的话,编译时就不会有错误,斑竹请指教
形参声明的时候写不写形参名都行,你编译有错误并不是这个问题。
你把swap函数放到main函数前面就行了。


未必钱多乐便多,财多累己招烦恼。 清贫乐道真自在,无牵无挂乐逍遥。
2006-04-06 13:51
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

[CODE]#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;
}
[/CODE]

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


2006-04-06 15:16
badly1984
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-3-9
收藏
得分:0 
2樓和4樓都是正解..................

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

看起來,我居然不是最差的...........— —b,lululau同學還要繼續努力呀..........
2006-04-06 21:11
快速回复:[求助]关于C++中的函数模板
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030559 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved