Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么可以';编译器没有找到我函数的重载版本吗?_Delphi_Delphi 10.2 Tokyo - Fatal编程技术网

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一起工作呢?这是相同的实现,但它是有效的…@loki
THttpClient
没有重载
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.