迷惑不解? 类模板的问题?编译器如何区分两个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();
}
...全文
70 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>会有不同的签名,不会重名。
源码直接下载地址: https://pan.quark.cn/s/8ac6a8c064f8 Intellij Idea 12 外部jar包导入操作指南 Intellij Idea 12作为一款功能丰富且被广泛采纳的集成开发环境(IDE),为开发者提供了多种便利的工具以支持快速且高效的软件开发与调试工作。在众多功能中,从外部导入jar包是Intellij Idea 12的一项核心操作,接下来的内容将系统性地阐释如何在Intellij Idea 12环境中执行外部jar包的导入操作。 _步骤一:进入项目结构设置界面_ 启动Intellij Idea 12软件,加载一个既有的项目或新建一个项目,随后通过点击“文件”(File)菜单并从下拉选项中选择“项目结构”(Project Structure),此操作将引导用户进入项目结构配置界面。 _步骤二:执行模块添加流程_ 在呈现的项目结构配置界面中,用户需选择“模块”(Modules)这一选项卡,随后点击界面上的“+”符号,并从弹出的列表中选择“JARs or directories”(jar文件或目录),这一步骤将触发“添加jar或目录”(Add Jar or Directory)的对话框显示。 _步骤三:指定要导入的jar文件_ 在“添加jar或目录”(Add Jar or Directory)的对话框中,用户需要浏览并选中计划导入的jar文件,之后点击“确定”(OK)按钮,以完成jar文件的添加过程至项目中。 _步骤四:验证jar文件的导入状态_ 完成上述步骤后,用户可返回至项目结构配置界面,并在“依赖项”(Dependencies)选项卡下查看到新添加的jar文件,这证明了jar文件已成功被导入至项目中。 _注意事项_...

24,851

社区成员

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

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