Delphi 为什么可以';编译器没有找到我函数的重载版本吗?
在不重载Delphi 为什么可以';编译器没有找到我函数的重载版本吗?,delphi,delphi-10.2-tokyo,Delphi,Delphi 10.2 Tokyo,在不重载Get的情况下(仅使用Get的第一个定义),否则编译ok: program Project1; {$APPTYPE CONSOLE} uses SysUtils, Classes; type TxALNameValuePair = record Name: ansistring; Value: ansistring; constructor Create(const AName, AValue: ansistring); end; TxALName
Get
的情况下(仅使用Get
的第一个定义),否则编译ok:
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.
程序项目1;
{$APPTYPE控制台}
使用SysUtils、类;
类型
TxALNameValuePair=记录
名称:安思婷;
值:ansistring;
构造函数创建(const AName,AValue:ansistring);
结束;
TxALNameValueArray=TArray;
TxALHTTPClient=类(ToObject)
私有的
受保护的
公众的
函数Get(const-aUrl:AnsiString;
const arequeseadervalues:TxALNameValueArray=nil):ansisting;超载;
函数Get(const-aUrl:AnsiString;
const aRequestFields:TStrings;
const AENCoderRequestFields:布尔值=True;
const arequeseadervalues:TArray=nil):ansisting;超载;
结束;
构造函数TxALNameValuePair.Create(const-AName,AValue:ansiString);
开始
名称:=AName;
值:=有效值;
结束;
函数TxALHTTPClient.Get(const aUrl:AnsiString;
const arequeseadervalues:TxALNameValueArray):ansisting;
开始
结束;
函数TxALHTTPClient.Get(const aUrl:AnsiString;
const aRequestFields:TStrings;
Const AENCoderRequestFields:布尔值=True;
const arequeseadervalues:TArray=nil):ansisting;
开始
结束;
变量
AHTTP客户:TXALHTTPC客户;
开始
aHttpClient:=TXALHTTPlient.Create;
aHttpCLient.get('http://www.toto.com”,[TxALNameValuePair.Create('Accept-Encoding','gzip'));
ReadLn;
结束。
但是当Get
过载时,它会产生
[dcc64错误]E2250没有过载
可以使用这些参数调用的“Get”版本
为什么编译器无法解决此重载问题?这里的问题是,您使用的动态数组构造函数正在生成TxALNameValuePair的
数组类型的对象,但所有重载都要求该类型为TxALNameValueArray
,而且编译器似乎没有在T=>TAxTxALNameValuePair的数组
==>TArray
之间建立连接
当重载没有引入歧义时,可以将数组隐式转换为正确的类型,但在其他情况下,似乎必须以某种方式提供该类型的信息。最简单(可能也是最清晰)的方法就是使用一个变量
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}
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版本很重要,因为我怀疑您有一个支持动态数组常量的版本。@J。。。的确如果没有MCVE,我们无法知道,但我怀疑,正如您所说,aHttpClient被声明为THttpClient,并且由于Get不是虚拟的,因此假设THttpCliet.Get(),然后参数就错了。但正如你所说,没有MCVE我们就不知道了。事实上,即使有几个人要求,洛基也不以提供MCVE而闻名。@j。。。对于MCVE,我复制问题中的代码,yu只需要在delphi中复制过去的代码。我在东京发行2@Victoria这是我的编辑-我不想重复这么多的代码,所以MCVE是一个有效的例子。添加重载会使其失败。也许还不够清楚。。。我会更新的。我不知道这个q如何值得被否决。但是为什么它会以这种方式与delphi THttpClient一起工作呢?这是相同的实现,但它是有效的…@lokiTHttpClient
没有重载Get
。函数Post(const AURL:string;const ASourceFile:string;const AResponseContent:TStream=nil;const AHeaders:TNetHeaders=nil):IHTTPResponse;超载代码>函数Post(const-AURL:string;const-ASource:TStrings;const-AResponseContent:TStream=nil;const-aencode:TEncoding=nil;const-AHeaders:TNetHeaders=nil):IHTTPResponse;超载代码>函数Post(const AURL:string;const ASource:TStream;const AResponseContent:TStream=nil;const AHeaders:TNetHeaders=nil):IHTTPResponse;超载代码>函数Post(const AURL:string;const ASource:TMultipartFormData;const AResponseContent:TStream=nil;const AHeaders:TNetHeaders=nil):IHTTPResponse;超载代码>@loki我明白你的意思了t阅读器
是一种系统定义的类型-可能只是编译器的魔法。我已经更新了答案。
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.