Delphi模糊重载调用MkDir

Mor*_*app 3 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;
Run Code Online (Sandbox Code Playgroud)

从查看源代码,有一个带字符串的版本,以及带有PChar的版本.我不确定我的字符串在这两种类型之间是多么模糊.


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

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

Dav*_*nan 5

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

program Project1;

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

begin
end.
Run Code Online (Sandbox Code Playgroud)

所以你的问题是代码中的其他地方你定义了一个不兼容的重载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.
Run Code Online (Sandbox Code Playgroud)

产生以下编译器错误:

[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.
Run Code Online (Sandbox Code Playgroud)

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

Delphi的现代版本解决了这个问题,并且您的代码会产生

[dcc32 Error] E2004 Identifier redeclared: 'System'

显然,解决方案是消除虚假使用System.

  • @mpt - 你不能两次使用'system',删除它.显然你可以在D7.无论如何,将其从用途中删除. (2认同)
  • @mpthrapp:编译器自动包含系统单元.在任何情况下,您都不必将其添加到您的使用条款中.每个版本的Delphi都是如此. (2认同)
  • 这个答案目前无法准确诊断问题.实际情况是,它是一个编译器错误,它允许包含两次单元名称. (2认同)
  • @SertacAkyuz我已经解决了这个问题.FWIW,我认为最初的答案确实合理地诊断了问题.*所以你的问题是你的代码中的其他地方你已经为MkDir定义了一个不兼容的重载.*我假设有一个原因,但谁能在代码到达之前看到实际原因?多么意想不到的惊喜!! 无论如何,谢谢你的提示. (2认同)