当我尝试调用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.
答案 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
。