为了账号安全,请及时绑定邮箱和手机立即绑定

C++中函数模板怎么用?

C++中函数模板怎么用?

Cats萌萌 2019-02-05 14:06:26
为什么下面的没法运行啊,怎么改。( //表示系统报的错误)#include<iostream>using namespace std;template<typename T>; //syntax error : '<end Parse>'T max(T a,T b,T c){ //missing ';' before '{'if(b>a) a=b;if(c>a) a=c;return a;}int main(){int i1=8,i2=5,i3=6,i;double d1=56.9,d2=90.765,d3=43.1,d;long g1=67843,g2=-456,g3=78123,g;i=max(i1,i2,i3); //'i' : undeclared identifier // 'max' : undeclared identifier d=max(d1,d2,d3); //'d' : undeclared identifier // 'max' : undeclared identifierg=max(g1,g2,g3); //'g' : undeclared identifier // 'max' : undeclared identifiercout<<"i_max="<<i<<endl;cout<<"d_max="<<d<<endl;cout<<"g_max="<<g<<endl;return 0;}
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

很不好意思,Java的特性比C++少得多。Java不支持模板。只支持很少的类似于C++模板的语法来实现很有限的泛型编程。

Java对泛型编程的支持也是最近才加进去的,而且支持的很不好。你就不用指望能像C++那样用它了。

Java是一个非常纯粹的OOP语言,它天生就是相对动态的、后期的,编译期处理的信息非常少,这和C++强静态的特性是完全相反的。

Java的绝大部分类型信息都属于RTTI,也就是在运行时动态获取,不像C++是在编译期由编译器推导的,所以Java基本上不可能支持C++那样灵活的模板。

Java的泛型也是,说白了只是个障眼法,用类似C++那样的模板语法来包装了其面向对象动态cast的本质而已。
举例说,java中的Vector<int>,你给里面保存int的时候,每一个int都是先被包装成一个Integer对象然后塞进去,取出来的时候是先取出Object对象,转换成Integer对象,然后再从里面取出int这个整数,绕了很大一个弯子。
虽然从代码上写的和C++差不多都很简洁,但是实际的效率和C++差了n个数量级。这点上实在是比较恶心,C#都做得比它好,C#至少对于值类型还是会实例化代码的。

Java天生就是一个鼓励动态化、运行期化、OOP化的一个语言,所以它不适合使用C++中那些泛型编程的范式来设计程序。你如果能够忍受Java的装箱拆箱的巨大效率损失,你可以用OOP的方式来实现那种同一个函数服务多种类型的想法,但是的确很低效。



查看完整回答
反对 回复 2019-03-20
?
富国沪深

TA贡献1790条经验 获得超9个赞

template<typename T>; 去掉分号
i=max(i1,i2,i3); 改成i=max<int>(i1, i2, i3)
d=max(d1,d2,d3); 改成max<double>
g=max(g1,g2,g3); 改成max<long>

查看完整回答
反对 回复 2019-03-20
  • 3 回答
  • 0 关注
  • 613 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信