为什么这个简单的泛型函数总是出错?

haitao5676 2011-01-11 03:15:59
#include "stdafx.h"

using namespace System;

generic<typename T> where T:IComparable
T MaxE(array<T>^ x);
int main(array<System::String ^> ^args)
{
array<double>^ h[]={0.0,4.3,6.5,5.6,7.8,2.1,9.5};
array<int>^ k[]={0,2,6,3,9,5,8,7};
double hData=MaxE(h);
int kData=MaxE(k);
Console::WriteLine(hData);
Console::WriteLine(kData);
return 0;
}
generic<typename T> where T:IComparable
T MaxE( array<T>^ x )
{
T val(x[0]);
for (int i=0;i<x->Length;i++)
{
if (val->CompareTo(x[i])<0)
{
val=x[i];
}
}
return val;
}
...全文
286 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
whycom 2011-01-13
  • 打赏
  • 举报
回复
array<double>^ h[]={0.0,4.3,6.5,5.6,7.8,2.1,9.5};有这么写托管数组的?

array<double>^ h={0.0,4.3,6.5,5.6,7.8,2.1,9.5};
FrankHB1989 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 haitao5676 的回复:]

引用 17 楼 taodm 的回复:

因为这里是纯C++版,不是C#版。
为了节约你自己的时间,自己早移贴吧。

怎么搞的?
这东西怎么就归到了c#这种东西了!
vc的东西不属于c++,我就没办法了,可是c++的东西非要和c#相提并论,我很别扭
不是c#不行,c#这种东西倒是什么都可以干,但是十分麻烦,实在不是可以相信的语言!
[/Quote]
C++/CLI被ECMA通过标准化,和这里的讨论C++(ISO C++的各种部分实现)根本就是两种不同的语言。所以你发错区了。
healer_kx 2011-01-12
  • 打赏
  • 举报
回复
哦,难怪楼主说我是C#高手,还是可能,呵呵,难怪没人搭理你了,哥哥我以前研究过一段时间CLI,但是我也懒得说了。
xzjxylophone 2011-01-12
  • 打赏
  • 举报
回复
这个还是简单的。。。。。。
taodm 2011-01-11
  • 打赏
  • 举报
回复
没人承认托管C++是C++。
你说这东西属于VC到还3分成立,那你也得移贴去VC版。
没人在这讨论托管C++,这就是现在的事实。再想不通你也只有移贴。
haitao5676 2011-01-11
  • 打赏
  • 举报
回复
我能考虑学c++/cli这种东西已经很给c#面子了,4年前我就已经把c#和vb归到一类了!
vb语言就已经是过去小学生可以理解的语言了!
haitao5676 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 taodm 的回复:]

因为这里是纯C++版,不是C#版。
为了节约你自己的时间,自己早移贴吧。
[/Quote]
怎么搞的?
这东西怎么就归到了c#这种东西了!
vc的东西不属于c++,我就没办法了,可是c++的东西非要和c#相提并论,我很别扭
不是c#不行,c#这种东西倒是什么都可以干,但是十分麻烦,实在不是可以相信的语言!
taodm 2011-01-11
  • 打赏
  • 举报
回复
因为这里是纯C++版,不是C#版。
为了节约你自己的时间,自己早移贴吧。
haitao5676 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 taodm 的回复:]

托管C++问题,楼主请自己移贴C#版吧。这边基本没人讨论这东西。
[/Quote]
明明是好东西,为什么没人讨论?
taodm 2011-01-11
  • 打赏
  • 举报
回复
托管C++问题,楼主请自己移贴C#版吧。这边基本没人讨论这东西。
pstrunner 2011-01-11
  • 打赏
  • 举报
回复
从编译错误来讲,非托管Array包含了托管的Type,楼主是否应该先查一下Type,把它改成也是非托管的。

楼主可以参考一下:
http://stackoverflow.com/questions/3600695/array-of-pin-ptrtype
hai040 2011-01-11
  • 打赏
  • 举报
回复
不懂,这里会托管c的估计不多
haitao5676 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hai040 的回复:]

引用 6 楼 haitao5676 的回复:
错误在这里:
error C2728: “cli::array<Type> ^”: 本机数组不能包含此托管类型
分明是泛型函数是完全失败的,不管什么类型都白扯!

是不支持array<IComparable>?
[/Quote]
那怎样才能让他支持呢?
因为我在写到T:后就没有代码提示了,IComparable是我硬写上去的!同时这个函数也是我硬写上去的:
val->CompareTo(x[i]),这个也没有代码提示!
haitao5676 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 healer_kx 的回复:]

C++/CLI的generic,和C#的泛型是一回事情,!但是和C++的template不一样的。
你可以看看C#的泛型,其实很简单的,没有C++模板那么强大的功能了。
两回事情。
[/Quote]
不好意思,你说的我看不懂!c#有没有泛型我不关心!他有多强大的功能我更不关心!
我这个是书上的例程,generric和template是c++在两种规范中为了实现函数重载的两种表现形式!两回事情从何谈起?
我觉得你应该是个c#高手,可我很早就已经不用c#了,我不太喜欢拿东西!
hai040 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 haitao5676 的回复:]
错误在这里:
error C2728: “cli::array<Type> ^”: 本机数组不能包含此托管类型
分明是泛型函数是完全失败的,不管什么类型都白扯!
[/Quote]
是不支持array<IComparable>?
healer_kx 2011-01-11
  • 打赏
  • 举报
回复
C++/CLI的generic,和C#的泛型是一回事情,!但是和C++的template不一样的。
你可以看看C#的泛型,其实很简单的,没有C++模板那么强大的功能了。
两回事情。
haitao5676 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ptrunner 的回复:]

能不能贴出完整代码,还是不清楚。
[/Quote]
大哥!你不是在跟我开玩笑吧!
你觉得我贴出的代码还不全?
再贴就得把别的程序里的代码给贴出去了!
pstrunner 2011-01-11
  • 打赏
  • 举报
回复
能不能贴出完整代码,还是不清楚。
haitao5676 2011-01-11
  • 打赏
  • 举报
回复
错误在这里:
error C2728: “cli::array<Type> ^”: 本机数组不能包含此托管类型
分明是泛型函数是完全失败的,不管什么类型都白扯!
pstrunner 2011-01-11
  • 打赏
  • 举报
回复
怎么个完蛋啦?不明白。
加载更多回复(4)
标准模板库设计人Stepanov早期从事教育工作,1970年代研究泛型程序设计,那时他与其同事一起在GE公司开发出一个新的程序语言——Tecton。 1983年,Stepanov先生转至Polytechnic大学教书,继续研究泛型程序设计,同时写了许多Scheme的程序,应用在graph与network的算法上,1985年又转至GE公司专门教授高阶程序设计,并将graph与network的Scheme程序,改用Ada写,用了Ada以后,他发现到一个动态(dynamically)类型的程序(如Scheme)与强制(strongly)类型的程序(如Ada)有多么的不同。 在动态类型的程序中,所有类型都可以自由的转换成别的类型,而强制类型的程序却不能。但是,强制类型在出错时较容易发现程序错误。 1988年Stepanov先生转至HP公司运行开发泛型程序库的工作。此时,他已经认识C语言中指针(pointer)的威力,他表示一个程序员只要有些许硬件知识,就很容易接受C语言中指针的观念,同时也了解到C语言的所有数据结构均可以指针间接表示,这点是C与Ada、Scheme的最大不同。 Stepanov并认为,虽然C++中的继承功能可以表示泛型设计,但终究有个限制。虽然可以在基础类型(superclass)定义算法和接口,但不可能要求所有对象皆是继承这些,而且庞大的继承体系将减低虚拟(virtual)函数的运行效率,这便违反的前面所说的“效率”原则。 到了C++模板观念,Stepanov参加了许多有关的研讨会,与C++之父Bjarne讨论模板的设计细节。如,Stepanov认为C++的函数模板(function template)应该像Ada一样,在声明其函数原型后,应该显式的声明一个函数模板之实例(instance);Bjarne则不然,他认为可以透过C++的重载(overloading)功能来表达。

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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