我正在尝试转换一些Free Pascal代码以使用Delphi 10.2进行编译。
免费的Pascal代码的结构如下:
generic TVolume<T> = class(TObject)
// T has to be a numerical/float type
constructor Create(pSizeX, pSizeY, pDepth: integer; c: T = 0);
constructor Create(Original: TBits; pFalse: T = -0.5; pTrue: T = +0.5);
Delphi不喜欢这样:E2268: Parameters of this type cannot have default values
我认为原因很简单,Delphi编译器不想假设T可能是什么类型,因此它拒绝对此进行编译。我要说的是FPC。
要解决此问题,我很可能必须创建一堆overload
方法:
TVolume<T> = class(TObject)
constructor Create(pSizeX, pSizeY, pDepth: integer); overload;
constructor Create(pSizeX, pSizeY, pDepth: integer; c: T); overload;
constructor Create(Original: TBits); overload;
constructor Create(Original: TBits; pFalse: T); overload;
constructor Create(Original: TBits; pFalse: T; pTrue: T); overload;
但是我仍然想知道在Delphi中是否有一种方法,我还不知道吗?
答案 0 :(得分:2)
这个问题的简单答案是:
否,由于在声明时未知
public bool UploadAvatar(string UserID, string Base64String) { if (string.IsNullOrEmpty(Base64String)) { ReturnMessage = "Profile picture upload failed. No data from photo!"; return false; } if (Base64ImageToFile(Base64String, filename, System.Drawing.Imaging.ImageFormat.Jpeg)) { ReturnMessage = "Profile picture uploaded successfully!"; return true; } ReturnMessage = "Failure uploading your profile picture!"; return false; } public bool Base64ImageToFile(string Base64String, string SaveAs, System.Drawing.Imaging.ImageFormat Format) { try { //Remove this part "data:image/jpeg;base64," Base64String = Base64String.Split(',')[1]; //Base64String = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ......" //This is where the error occurs byte[] bytes = Convert.FromBase64String(Base64String); Image image; using (var ms = new MemoryStream(bytes)) { image = Image.FromStream(ms); } image.Save(SaveAs, Format); return true; } catch (Exception ex) { ReturnMessage = ex.Message; return false; } }
的类型,因此无法将默认参数传递给Delphi中的泛型类型T
。而且由于Delphi是单遍编译器,因此不允许这样做。
免费Pascal 实现了2-pass processing of Generics。这就是为什么它可以延迟泛型的代码生成,直到在实现过程中遇到专业化的情况。
在这种特定情况下,我们发现甚至都不需要通用声明T
。在整个Free Pascal项目中,TVolume
仅作为TVolume<T>
实施一次。 TNNetVolume = class (specialize TVolume<TNeuralFloat>)
的类型为TNeuralFloat
。因此,Single
的通用声明可以更改为TVolume<T>
,并且TVolume
的所有引用都可以替换为T
。该方法可以在Delphi中进行编译。
感谢Rudy Velthuis ,Remy Lebeau和David Heffernan的帮助和贡献,以解决这一问题。 :)