迷惑不解? 类模板的问题?编译器如何区分两个class?

phonlee 2003-07-28 03:48:08
1 对于函数模板
#include <iostream.h>

template<class T> T compare_values(T a, T b)
{
return((a > b) ? a: b);
}

float compare_values(float a, float b);
int compare_values(int a, int b);
long compare_values(long a, long b);

void main(void)
{
float a = 1.2345, b = 2.34567;
cout << "Comparing " << a << ' ' << b << ' ' <<
compare_values(a, b) << endl;

int c = 1, d = 1001;
cout << "Comparing " << c << ' ' << d << ' ' <<
compare_values(c, d) << endl;

long e = 1010101L, f = 2020202L;
cout << "Comparing " << e << ' ' << f << ' ' <<
compare_values(e, f) << endl;
}

很显然,函数同名,但是参数不同----〉编译器可以区分他们?
但是大家看看下面的类呢?编译器如何区分他们;因为从source code上看,
两个class是重名的?---那么这在通常的情况是语法错误。那么编译器坐了什么手脚?


2 对于类模板
#include <iostream.h>

template<class T> class Distance {
public:
Distance(T distance);
void show_distance(void) {
cout << "The distance is " << distance << " miles\n"; };
private:
T distance;
};

template<class T>
Distance<T>::Distance(T distance) { Distance::distance = distance; };


void main(void)
{
Distance<int> short_distance(100);
Distance<long> long_distance(2000000L);

short_distance.show_distance();
long_distance.show_distance();
}
...全文
23 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
phonlee 2003-07-28
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2081/2081970.xml?temp=2.073306E-02
phonlee 2003-07-28
  • 打赏
  • 举报
回复
楼上好功夫!


另外开贴请教。
关于OOD的?





短歌如风 2003-07-28
  • 打赏
  • 举报
回复

事实上,VC6在处理模板函数签名时反倒有些问题:它只根据函数参数生成签名而不考虑模板参数,因此对于如下函数代码:

#include <typeinfo>
#include <iostream>

template <typename T>
const char * TypeName()
{
return typeid(T).name();
}

#define TRACK(X) std::cout << "**** " << #X << " ****" << std::endl; X

main()
{
TRACK(std::cout<<TypeName<int>()<<std::endl);
TRACK(std::cout<<TypeName<double>()<<std::endl);
std::cin.ignore(-1);
std::cin.get();
}
在VC6中编译结果是不正确的,运行输出为:
**** std::cout<<TypeName<int>()<<std::endl ****
double
**** std::cout<<TypeName<double>()<<std::endl ****
double

而在BCB和Dev C++中则一切正常。在加上以前ITWorker发的关于“模板函数连接”的问题的贴子,可以看出在BCB和在Dev C++中在生成函数签名时考虑了模板参数,而VC6则只考虑了函数参数。
短歌如风 2003-07-28
  • 打赏
  • 举报
回复

函数同名但参数不同时C++编译器会把函数参数类型与函数名结合起来生成最终的名字(通常被称为“函数签名”),同理,编译器在对模板进行实例化时也会把模板参数与模板(类或函数)结合起来生成最终的名字。所以Distance<int>和Distance<long>会有不同的签名,不会重名。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧