哪有免费的网站,ppt模板免费模板下载,广告代运营,南通高端网站建设机构4.2.5 重载和模糊调用
当调用一个重载的函数时#xff0c;编译器通常会找到匹配的版本并正确工作#xff0c;或者如果没有任何重载版本具有正确匹配的参数#xff08;正如我们刚刚看到的#xff09;#xff0c;则会报出错误。
但还有第三种情况#xff1a;假设编…4.2.5 重载和模糊调用
当调用一个重载的函数时编译器通常会找到匹配的版本并正确工作或者如果没有任何重载版本具有正确匹配的参数正如我们刚刚看到的则会报出错误。
但还有第三种情况假设编译器可以对函数的参数进行一些类型转换则单个调用可能会有不同的可能转换。当编译器找到它可以调用的函数的多个版本并且没有一个是完全类型匹配的版本将被选取时它会发出一条错误消息指示函数调用不明确。
这不是一个常见的场景我不得不构建一个相当不合逻辑的例子来向你展示它但值得考虑这种情况因为它在现实世界中偶尔会发生。
假设您决定实现两个重载函数把一个整数和浮点数相加
function Add(N: Integer; S: Single): Single; overload;
beginResult : N S;
end;function Add(S: Single; N: Integer): Single; overload;
beginResult : N S;
end; 这些函数在 OverloadTest 示例中。现在您可以以任何顺序传递两个参数来调用它们
Show(Add(10, 10.0).ToString);
Show(Add(10.0, 10).ToString); 但事实上一般来说函数可以进行转换接受不同类型的参数例如当函数期望参数为浮点类型时可以接受整数类型的参数。那么如果您调用
Show(Add(10, 10).ToString); 编译器可以调用重载函数的第一个版本但它也可以调用第二个版本。如果编译器不知道你在要求什么也不知道调用一个函数或另一个函数是否会产生相同的效果它就会报出错误信息
[dcc32 Error] E2251 Ambiguous overloaded call to Add Related method: function Add(Integer; Single): Single; Related method: function Add(Single; Integer): Single;小贴士在集成开发环境的错误窗格中你会看到上面第一行的错误信息边上有一个加号可以展开查看下面两行详细说明了编译器认为哪些重载函数有歧义。 如果这是一个真实的情况并且您需要进行函数调用您可以添加手动类型转换调用来解决问题并向编译器指示您想要调用函数的哪个版本
Show(Add(10, 10.ToSingle).ToString); 如果您使用变体(variants)这是一种我将在本书后面介绍的相当独特的数据类型有可能出现模糊调用的特殊情况。