Delphi 对 MkDir 的不明确的重载调用

Delphi Ambiguous Overloaded Call to MkDir

我尝试调用 MkDir 时收到以下错误消息

[Error] DBaseReindexer.dpr(22): Ambiguous overloaded call to MkDir

我已经尝试了以下方法,它们都return同样的错误。

MkDir('test');

var
  Dir: String;
begin
  Dir := 'test';
  MkDir(Dir);
end;

const
  Dir = 'test';
begin
  MkDir(Dir);
end;

从源代码来看,有一个版本接受一个字符串,一个版本接受一个 PChar。我不确定我的字符串在这两种类型之间有何歧义。


重现错误的代码(来自评论):

program Project1; 
{$APPTYPE CONSOLE} 
uses SysUtils, System; 
begin 
  MkDir('Test');  
end.

您的代码在空项目中编译良好:

program Project1;

procedure Test;
const
  ConstStr = 'test';
var
  VarStr: string;
begin
  MkDir('Test');
  MkDir(ConstStr);
  MkDir(VarStr);
end;

begin
end.

所以您的问题是您在代码的其他地方为 MkDir 定义了不兼容的重载。例如这个程序:

program Project1;

procedure MkDir(const S: string); overload;
begin
end;

procedure Test;
const
  ConstStr = 'test';
var
  VarStr: string;
begin
  MkDir('Test');
  MkDir(ConstStr);
  MkDir(VarStr);
end;

begin
end.

产生以下编译器错误:

[dcc32 Error] Project1.dpr(13): E2251 Ambiguous overloaded call to 'MkDir'
  System.pas(5512): Related method: procedure MkDir(const string);
  Project1.dpr(3): Related method: procedure MkDir(const string);
[dcc32 Error] Project1.dpr(14): E2251 Ambiguous overloaded call to 'MkDir'
  System.pas(5512): Related method: procedure MkDir(const string);
  Project1.dpr(3): Related method: procedure MkDir(const string);
[dcc32 Error] Project1.dpr(15): E2251 Ambiguous overloaded call to 'MkDir'
  System.pas(5512): Related method: procedure MkDir(const string);
  Project1.dpr(3): Related method: procedure MkDir(const string);

注意编译器如何帮助您告诉您哪两个方法不能消除歧义。如果您阅读了完整的编译器错误消息,它将带您找到问题的原因。

旧的 Delphi 版本不会为您提供额外的信息。所以如果你处于那个位置,你将不得不在你的源代码中搜索额外的 MkDir.

更新

在对添加代码的问题进行编辑之后,我们可以看到不兼容的重载来自一个相当令人惊讶的来源。您的代码是:

program Project1; 
{$APPTYPE CONSOLE} 
uses SysUtils, System; 
begin 
  MkDir('Test');  
end.

嗯,System 自动包含在每个单元中,编译器通过 uses 子句是编译器缺陷。但是错误的第二次包含 System 是造成歧义的原因。

Delphi 的现代版本修复了这个问题,您的代码结果为

[dcc32 Error] E2004 Identifier redeclared: 'System'

显然,解决方案是删除 System.

的虚假使用