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
.
的虚假使用
我尝试调用 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
.