Delphi模糊重载调用MkDir

时间:2015-04-23 15:56:50

标签: delphi delphi-7

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

  

[错误] DBaseReindexer.dpr(22):对MkDir的不明确的重载调用

我尝试过以下内容,但都返回了同样的错误。

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.

1 个答案:

答案 0 :(得分:5)

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

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