gpt4 book ai didi

delphi - 为什么编译器找不到我的函数的重载版本?

转载 作者:行者123 更新时间:2023-12-03 15:22:58 25 4
gpt4 key购买 nike

如果 Get 没有被重载(仅使用 Get 的第一个定义),则编译正常:

program Project1;
{$APPTYPE CONSOLE}

uses SysUtils, Classes;

type
TxALNameValuePair = record
Name: ansistring;
Value: ansistring;
constructor Create(const AName, AValue: ansistring);
end;
TxALNameValueArray = TArray<TxALNameValuePair>;

TxALHTTPClient = class(TObject)
private
protected
public
Function Get(const aUrl:AnsiString;
const ARequestHeaderValues: TxALNameValueArray = nil): AnsiString; overload;
Function Get(const aUrl:AnsiString;
const aRequestFields: TStrings;
const aEncodeRequestFields: Boolean=True;
const ARequestHeaderValues: TArray<TxALNameValuePair> = nil): AnsiString; overload;
end;

constructor TxALNameValuePair.Create(const AName, AValue: ansiString);
begin
Name := AName;
Value := AValue;
end;

function TxALHTTPClient.Get(const aUrl: AnsiString;
const ARequestHeaderValues: TxALNameValueArray): AnsiString;
begin
end;

Function TxALHTTPClient.Get(const aUrl:AnsiString;
const aRequestFields: TStrings;
Const aEncodeRequestFields: Boolean=True;
const ARequestHeaderValues: TArray<TxALNameValuePair> = nil): AnsiString;
begin
end;

var
aHttpCLient: TxALHTTPClient;
begin
aHttpClient := TxALHTTPClient.Create;
aHttpCLient.get('http://www.toto.com', [TxALNameValuePair.Create('Accept-Encoding', 'gzip')]);
ReadLn;
end.

但是当 Get 重载时,它会产生

[dcc64 Error] E2250 There is no overloaded version of 'Get' that can be called with these arguments

为什么编译器无法解决此重载?

最佳答案

这里的问题是您正在使用的动态数组构造函数正在生成 array of TxALNameValuePair 类型的对象。 ,但所有重载都要求类型为 TxALNameValueArray ,并且编译器似乎没有在 array of TxALNameValuePair 之间建立连接==> TArray<T>对于 T => TAxTxALNameValuePair .

当重载没有引入歧义时,数组可以隐式转换为正确的类型,但否则似乎您必须以某种方式提供该类型信息。最简单(也可能是最清晰)的方法就是使用变量。

var
aHttpCLient: TxALHTTPClient;
nvpArray : TxALNameValueArray;
begin
aHttpClient := TxALHTTPClient.Create;
nvpArray := [TxALNameValuePair.Create('Accept-Encoding', 'gzip')];
aHttpCLient.get('http://www.toto.com', nvpArray);
ReadLn;
end.

您还可以使用类型化动态数组构造函数就地构造数组:

var
aHttpCLient: TxALHTTPClient;
begin
aHttpClient := TxALHTTPClient.Create;
aHttpCLient.get('http://www.toto.com',
TxALNameValueArray.Create(
TxALNameValuePair.Create('Accept-Encoding', 'gzip')
));
ReadLn;
end.

否则,除非您对自己的名称-值对记录类型有特殊需要,否则您可以只使用 System.Net.URLClient 中提供的记录类型。 :

program Project1;
{$APPTYPE CONSOLE}

uses SysUtils, Classes, System.Net.URLClient;

type
TxALHTTPClient = class(TObject)
private
protected
public
Function Get(const aUrl:AnsiString;
const ARequestHeaderValues: TNameValueArray = nil): AnsiString; overload;
Function Get(const aUrl:AnsiString;
const aRequestFields: TStrings;
const aEncodeRequestFields: Boolean=True;
const ARequestHeaderValues: TNameValueArray = nil): AnsiString; overload;
end;

function TxALHTTPClient.Get(const aUrl: AnsiString;
const ARequestHeaderValues: TNameValueArray): AnsiString;
begin
end;

Function TxALHTTPClient.Get(const aUrl:AnsiString;
const aRequestFields: TStrings;
Const aEncodeRequestFields: Boolean=True;
const ARequestHeaderValues: TNameValueArray = nil): AnsiString;
begin
end;

var
aHttpCLient: TxALHTTPClient;
begin
aHttpClient := TxALHTTPClient.Create;
aHttpCLient.get('http://www.toto.com', [TNameValuePair.Create('Accept-Encoding', 'gzip')]);
ReadLn;
end.

我猜这之所以有效,只是因为编译器的魔力,即系统定义的类型。

沿着这条路线,您同样可以使用 TNetHeaders而不是TNameValueArray ,前者只是这种类型的别名。您还可以创建自己的别名,例如

TxALNameValueArray = TNetHeaders;

如果你真的想要的话。

<小时/>

深入挖掘,我们可以生成一个显示问题的最小示例:

program Project1;
{$APPTYPE CONSOLE}

type
TDblArray = TArray<double>;

procedure A(i : integer; da : TDblArray); overload;
begin
end;

procedure A(s : string; da : TDblArray); overload;
begin
end;

begin
A(1, [1.0]);
end.

编译时不会出现相同的错误。

但是,这确实有效:

program Project1;
{$APPTYPE CONSOLE}

type
TDblArray = array of double;

procedure A(i : integer; da : TDblArray); overload;
begin
end;

procedure A(s : string; da : TDblArray); overload;
begin
end;

begin
A(1, [1.0]);
end.

就像这样:

program Project1;
{$APPTYPE CONSOLE}

uses Types;

procedure A(i : integer; da : TDoubleDynArray); overload;
begin
end;

procedure A(s : string; da : TDoubleDynArray); overload;
begin
end;

begin
A(1, [1.0]);
end.

也许我们想称其为编译器错误?我不知道。正常类型解析向前工作,但对于重载解析,它必须向后工作......在一般情况下,这可能是一个停止的问题情况。如果您对此有强烈感觉,可以提交 QP。

关于delphi - 为什么编译器找不到我的函数的重载版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com