问题标签 [overload-resolution]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
72 浏览

c++ - Trouble With Overload Resolution

Id like to say that there's a ton of C++ Overloading questions already on SO, but after an hour of looking at them and other posts on forums and newsgroups, I'm still stumped.

Background

I've created a namespace, call it A, where a bunch of classes have the same way of implementing the < operator. In order to avoid code duplication, I wrote this:

In a header file called operator_forwards.h along with a few other declarations. I then made it a friend to the correct classes by adding a line like this:

Finally, I put the definition in a file called operators.h like this:

And included everything in one header file:

The Problem

The problem is when I call operator< like this:

它调用 A::operator< 很好,但是它递归地调用自己来做ex1.start<ex2.start而不是查找更专业的 operator< 用于 vector::iterator。导致错误 C2039: start is not a member of vector::iterator。

有人对确保 A::operator< 为 ex1.start 调用正确的 operator< 有任何建议吗?

注意:大约有 20 个类使用 A::operator<,所以如果我可以避免在每个类中单独定义它,那就太好了。

0 投票
2 回答
154 浏览

c++ - 函数对象如何影响重载决议?

在重载决议期间,函数对象的处理方式是否与常规函数不同?如果是这样,怎么做?

我遇到了以下情况,用等效可调用的函数对象替换函数会改变代码的含义:

这里的输出是“N::bar”。到目前为止,一切都很好:ADL 正在找到 N::bar,N::bar 和全局 bar 都是完全匹配的,并且 N::bar 是首选,因为它不是模板。

但是,如果我将全局 bar 更改为函数对象,如下所示:

输出现在是“全局栏”。为什么有区别?

0 投票
4 回答
165 浏览

c# - 过载分辨率异常

不确定这是否特定于 C# 4+,但只是注意到了这一点。

考虑以下类:

调用Fooin Bar,解析为Foo(object, object)

将其更改为:

调用Fooin Bar,解析为Foo(object, DayOfWeek)

我的理解是它应该总是像第二个例子一样解决。

这是一个“错误”还是只是我缺乏理解(或无知)?

更新:

感谢您的回答。正如我所发现的,可以base.用来调用基类中的方法。然而,当在混合中添加另一个派生类时,问题又回来了。

base.调用在 中有效Program,但随后解析为Foo(object, object)in Derived

Foo(object,DayOfWeek)从那时起如何调用Derived而不必在其中创建“冗余”方法Program

0 投票
1 回答
941 浏览

arrays - Delphi 如何解决带有指针(无类型)参数的重载函数?

下面是几个重载的函数。尝试猜测其中哪个函数会被调用。

事实上,第二个被调用并在第二个调用时抛出 AV。鉴于旧的 VCL 模式使用PointerInteger可互换(例如TListandTStrings.ObjectsTWinControl.Tag)可能会在相当常规的代码上导致意外的 AV。

{$T+}不会改变行为,所以德尔福认为^Byte不是Pointer.

但是声明p: PInteger;修复它。开放数组变体也不需要指针,并且与泛型数组变体不同地处理/命名。动态数组的名称修改与通用数组不同,因此两者都可以使用,但如果两者都未注释,则在调用站点会发生模棱两可的重载错误。但是,如果在禁用通用数组和未注释动态数组的情况下进行编译 - 会发生同样的奇怪行为。

为什么编译器在参数为 a 时解析为动态/通用数组Pointer,而在参数为时解析为无类型常量PInteger

PS。已开QC 109019

0 投票
2 回答
159 浏览

c# - 在类定义中强制优先选择重载?

我有一个通用类。它有 2 个构造函数。这些在我组织的代码库中被广泛使用。

我想添加一些功能但保持向后兼容。所以我想为每个构造函数引入一个新的布尔可选参数:

但是,我已经有一堆用法,其中 T 是布尔值并传递了一个默认值:

现在,根据重载偏好法则 - 编译器将所有此类构造函数的用法与重载接受联系起来someFlag,因为类型化方法“知道得更好”。虽然在大多数情况下都非常合理,但这显然破坏了我的向后兼容性。

我的问题很简单:是否有可用的语言功能来覆盖默认的重载偏好法则,并将旧的通用重载定义为首选,这样我就不必更改所有这些用法?

当然,这种设计的一个缺点是,每当我想调用第一个重载(只有someFlag参数)时,我都必须按照 C# 4 规范指定一个命名参数。

也欢迎对其他设计提出建议,但请先尝试回答我的问题:)。

0 投票
1 回答
274 浏览

c# - 如何以编程方式使用泛型执行重载解决方案

我有许多MethodBase实例引用不同的开放通用方法(expected),例如代表以下方法:

我有一个MethodBase引用封闭方法的单个实例,该方法实际上被称为 ( actual),例如:

我如何以编程方式检查actual封闭方法是否可以匹配任何给定的expected开放方法,尤其是在考虑所有泛型陷阱和复杂性时?

具体来说,我想确定给定封闭方法的expected列表中的正确项目是而不是第二个。actualT Foo<T>(string nevermind, T other);

此外,对于MethodBase对应于 double Foo<double>(double something, string other)我希望没有匹配的结果。

遍历候选方法并检查每个参数expected是否可以从相应actual参数分配是一种好方法吗?如果是这样,这是最简单的方法吗?我是否需要考虑任何特殊情况以不匹配不会根据 .NET 中的方法重载解析规则选择的方法?

0 投票
1 回答
203 浏览

c++ - 看似模棱两可的模板函数重载

偶然发现时我试图解决的原始问题是选择parse_impl版本:

  • 如果解析器(类型U)提供了一个名为 的字段"skp",则使用该字段;
  • 如果没有,请使用默认值。

我想出了以下代码:

呼叫站点如下所示:

这对于有和没有的类型都调用skp

它可以编译(在 gcc4.7 上),但我不明白为什么:当skp存在时,两个enable_ifs 中的表达式都应该评估为真(skipper_type显然不等于unused_typethen),并且调用应该是模棱两可的。我错在哪里?

0 投票
1 回答
131 浏览

c# - 将裸空文字与用户定义的运算符一起使用时的奇怪重载解决方案

(标题中的“用户定义”是指加减法TimeSpanDateTime不是C#标准的一部分。它们在BCL中定义。)

在可空值TimeSpanDateTime值上使用提升运算符,我编写了以下代码。请注意,该框架在TimeSpan和上提供了不同的操作DateTime

有一个对称的(和可交换的)加法,你取两个TimeSpan并返回 sum TimeSpan。这种加法的“逆”是两个相减TimeSpan得到 a TimeSpan

然后是另一种加法,不对称,你需要一个DateTime(左操作数)和一个TimeSpan(右操作数)来产生一个DateTime. 由于此操作的不对称性,它有两种“逆”:一种是您将两个相减DateTime以获得TimeSpan差异,另一种是您有一个DateTime并从中减去一个TimeSpan以产生结果DateTime

有些问题自然而然地出现。

o允许并给出一个int?(为什么不是long?顺便说一句?)虽然是不允许的,这有点奇怪g。这在规范中吗?c此外,通过字符串连接解决“不可能”有点奇怪。显然编译器决定nullinc是一个(string)null. 另一方面,将显式类型的表达式添加object到 a将不会编译。DateTime

但我的主要问题是:为什么编译器可以为dand选择重载l,但m它抱怨歧义?

0 投票
1 回答
46 浏览

c++ - 非内置模板,内置重载

我正在提供一个支持函数 bar() 的库。传入标量值(如 double、int 等)时的作用与传入非标量值(在所有预期情况下,用户定义类型)时发生的情况不同。所以我写了这样的代码:

问题出在 main() 的第二行。此代码的结果是“T”的输出。编译器更喜欢模板而不是对 bar(double) 的调用,我假设这是因为参数是 int,它宁愿将其强制转换为 int const&(因为 const& 可以引用 r 值)。

我的问题是“有没有一种方法可以支持每个标量值而无需明确指出它们?” 我真的不想说出所有可能的类型,因为……嗯……有很多。我必须涵盖从 char 到 long long 的所有内容,包括 volatile 和 unsigned 的每种组合,等等。

我知道只需将 4 更改为 4.0 即可,但这是用于库的公共接口,并且要求用户键入4.0而不是4很脏。

0 投票
2 回答
177 浏览

c++ - 编译器可以告诉我它选择了哪个重载或模板函数吗?

特别是在 linux 上使用 g++,有没有办法确定为特定语句选择了哪个重载或模板函数?

更具体地说,我不认为我一定知道所有可能的选择,它们可能在来自各种库的头文件中。即使我这样做了,我也不认为我可以修改相关代码。