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

为什么下面的没法运行啊,怎么改。( //表示系统报的错误)
#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 identifier
g=max(g1,g2,g3); //'g' : undeclared identifier // 'max' : undeclared identifier
cout<<"i_max="<<i<<endl;
cout<<"d_max="<<d<<endl;
cout<<"g_max="<<g<<endl;
return 0;
}

Cats萌萌
浏览 616回答 3
3回答

九州编程

很不好意思,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的方式来实现那种同一个函数服务多种类型的想法,但是的确很低效。

富国沪深

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>
打开App,查看更多内容
随时随地看视频慕课网APP