【问题标题】:E2251 Ambiguous overloaded call to 'TextToFloat'E2251 对“TextToFloat”的模糊重载调用
【发布时间】:2017-09-18 06:37:47
【问题描述】:

我的代码:

function  Str2Dbl(const str: string; var v: double): boolean;
var
  dp: integer;
  cstr: string;
  xv: extended;
begin
  if FormatSettings.DecimalSeparator <> '.' then
  begin
    dp := pos('.', str);
    if dp <> 0 then
    begin
      cstr := str;
      cstr[dp] := FormatSettings.DecimalSeparator;
    end
    else
      cstr := str;
  end
  else
    cstr := str;
  if cstr <> '' then
    result := TextToFloat(@cstr[1], xv, fvExtended, FormatSettings)
  else
    result := false;
  if result then
    v := xv;
end;

在 Delphi 10.2 中它给出了一个错误:

[dcc32 Error] commutil.pas(1005): E2251 Ambiguous overloaded call to 'TextToFloat'
      System.SysUtils.pas(18332): Related method: function TextToFloat(PWideChar; var; TFloatValue; const TFormatSettings): Boolean;
      System.SysUtils.pas(18515): Related method: function TextToFloat(PAnsiChar; var; TFloatValue; const TFormatSettings): Boolean;

我不明白如何解决这个错误!!!

【问题讨论】:

    标签: delphi


    【解决方案1】:

    错误是因为@cstr[1] 的类型为Pointer,并且重载解析不知道您想要哪个重载(PAnsiCharPWideChar)。

    在任何情况下,使用@cstr[1] 通常是错误的,如果cstr 为空,则会因运行时错误而失败。请改用PChar(cstr)。这也将允许重载解析起作用。

    感谢您测试 cstr 是否为空,但如果您使用 PChar(...) 演员表的魔力,则无需进行该测试。即使字符串为空,PChar(...) 也会提供指向以 null 结尾的字符数组的有效指针。

    documentation 值得就此主题进行咨询。关键语句是:

    PChar(S) 总是返回一个指向内存块的指针;如果S 为空,则返回指向#0 的指针。

    所以,你将能够替换:

    if cstr <> '' then
      result := TextToFloat(@cstr[1], xv, fvExtended, FormatSettings)
    else
      result := false;
    

    无论如何都没有编译,带有:

    result := TextToFloat(PChar(cstr), xv, fvExtended, FormatSettings)
    

    确实可以编译并避免 if 语句样板。

    一边

    我最初期望通过{$T+} 启用typed address operator 将使@cstr[1] 成为类型化指针并有助于解决重载问题。然而,事实并非如此。令我惊讶的是,这个程序可以编译:

    {$T+}
    
    var
      PA: PAnsiChar;
      PW: PWideChar;
      s: string;
    
    begin
      PA := @s[1];
      PW := @s[1];
    end.
    

    链接的documentation 说:

    @ 应用于{$T+} 状态的变量引用时,结果的类型为^T,其中T 仅与指向变量类型的指针兼容。

    这似乎与

    相矛盾

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2011-12-12
      • 2014-09-05
      • 2016-03-26
      相关资源
      最近更新 更多