问题标签 [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.
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<,所以如果我可以避免在每个类中单独定义它,那就太好了。
c++ - 函数对象如何影响重载决议?
在重载决议期间,函数对象的处理方式是否与常规函数不同?如果是这样,怎么做?
我遇到了以下情况,用等效可调用的函数对象替换函数会改变代码的含义:
这里的输出是“N::bar”。到目前为止,一切都很好:ADL 正在找到 N::bar,N::bar 和全局 bar 都是完全匹配的,并且 N::bar 是首选,因为它不是模板。
但是,如果我将全局 bar 更改为函数对象,如下所示:
输出现在是“全局栏”。为什么有区别?
c# - 过载分辨率异常
不确定这是否特定于 C# 4+,但只是注意到了这一点。
考虑以下类:
调用Foo
in Bar
,解析为Foo(object, object)
。
将其更改为:
调用Foo
in Bar
,解析为Foo(object, DayOfWeek)
。
我的理解是它应该总是像第二个例子一样解决。
这是一个“错误”还是只是我缺乏理解(或无知)?
更新:
感谢您的回答。正如我所发现的,可以base.
用来调用基类中的方法。然而,当在混合中添加另一个派生类时,问题又回来了。
该base.
调用在 中有效Program
,但随后解析为Foo(object, object)
in Derived
。
Foo(object,DayOfWeek)
从那时起如何调用Derived
而不必在其中创建“冗余”方法Program
?
arrays - Delphi 如何解决带有指针(无类型)参数的重载函数?
下面是几个重载的函数。尝试猜测其中哪个函数会被调用。
事实上,第二个被调用并在第二个调用时抛出 AV。鉴于旧的 VCL 模式使用Pointer
和Integer
可互换(例如TList
andTStrings.Objects
和TWinControl.Tag
)可能会在相当常规的代码上导致意外的 AV。
{$T+}不会改变行为,所以德尔福认为^Byte
不是Pointer.
但是声明p: PInteger;
修复它。开放数组变体也不需要指针,并且与泛型数组变体不同地处理/命名。动态数组的名称修改与通用数组不同,因此两者都可以使用,但如果两者都未注释,则在调用站点会发生模棱两可的重载错误。但是,如果在禁用通用数组和未注释动态数组的情况下进行编译 - 会发生同样的奇怪行为。
为什么编译器在参数为 a 时解析为动态/通用数组Pointer
,而在参数为时解析为无类型常量PInteger
?
- 相关:Delphi 如何解决带有整数参数的重载函数?
- 相关:为什么“字符串数组”的两个别名处理不同?
- 相关:QC 108978
- 代码来自:http ://www.sql.ru/forum/actualthread.aspx?tid=970289
PS。已开QC 109019
c# - 在类定义中强制优先选择重载?
我有一个通用类。它有 2 个构造函数。这些在我组织的代码库中被广泛使用。
我想添加一些功能但保持向后兼容。所以我想为每个构造函数引入一个新的布尔可选参数:
但是,我已经有一堆用法,其中 T 是布尔值并传递了一个默认值:
现在,根据重载偏好法则 - 编译器将所有此类构造函数的用法与重载接受联系起来someFlag
,因为类型化方法“知道得更好”。虽然在大多数情况下都非常合理,但这显然破坏了我的向后兼容性。
我的问题很简单:是否有可用的语言功能来覆盖默认的重载偏好法则,并将旧的通用重载定义为首选,这样我就不必更改所有这些用法?
当然,这种设计的一个缺点是,每当我想调用第一个重载(只有someFlag
参数)时,我都必须按照 C# 4 规范指定一个命名参数。
也欢迎对其他设计提出建议,但请先尝试回答我的问题:)。
c# - 如何以编程方式使用泛型执行重载解决方案
我有许多MethodBase
实例引用不同的开放通用方法(expected
),例如代表以下方法:
我有一个MethodBase
引用封闭方法的单个实例,该方法实际上被称为 ( actual
),例如:
我如何以编程方式检查actual
封闭方法是否可以匹配任何给定的expected
开放方法,尤其是在考虑所有泛型陷阱和复杂性时?
具体来说,我想确定给定封闭方法的expected
列表中的正确项目是而不是第二个。actual
T Foo<T>(string nevermind, T other);
此外,对于MethodBase
对应于 double Foo<double>(double something, string other)
我希望没有匹配的结果。
遍历候选方法并检查每个参数expected
是否可以从相应actual
参数分配是一种好方法吗?如果是这样,这是最简单的方法吗?我是否需要考虑任何特殊情况以不匹配不会根据 .NET 中的方法重载解析规则选择的方法?
c++ - 看似模棱两可的模板函数重载
偶然发现时我试图解决的原始问题是选择parse_impl
版本:
- 如果解析器(类型
U
)提供了一个名为 的字段"skp"
,则使用该字段; - 如果没有,请使用默认值。
我想出了以下代码:
呼叫站点如下所示:
这对于有和没有的类型都调用skp
。
它可以编译(在 gcc4.7 上),但我不明白为什么:当skp
存在时,两个enable_if
s 中的表达式都应该评估为真(skipper_type
显然不等于unused_type
then),并且调用应该是模棱两可的。我错在哪里?
c# - 将裸空文字与用户定义的运算符一起使用时的奇怪重载解决方案
(标题中的“用户定义”是指加减法TimeSpan
和DateTime
不是C#标准的一部分。它们在BCL中定义。)
在可空值TimeSpan
和DateTime
值上使用提升运算符,我编写了以下代码。请注意,该框架在TimeSpan
和上提供了不同的操作DateTime
。
有一个对称的(和可交换的)加法,你取两个TimeSpan
并返回 sum TimeSpan
。这种加法的“逆”是两个相减TimeSpan
得到 a TimeSpan
。
然后是另一种加法,不对称,你需要一个DateTime
(左操作数)和一个TimeSpan
(右操作数)来产生一个DateTime
. 由于此操作的不对称性,它有两种“逆”:一种是您将两个相减DateTime
以获得TimeSpan
差异,另一种是您有一个DateTime
并从中减去一个TimeSpan
以产生结果DateTime
。
有些问题自然而然地出现。
o
允许并给出一个int?
(为什么不是long?
顺便说一句?)虽然是不允许的,这有点奇怪g
。这在规范中吗?c
此外,通过字符串连接解决“不可能”有点奇怪。显然编译器决定null
inc
是一个(string)null
. 另一方面,将显式类型的表达式添加object
到 a将不会编译。DateTime
但我的主要问题是:为什么编译器可以为d
and选择重载l
,但m
它抱怨歧义?
c++ - 非内置模板,内置重载
我正在提供一个支持函数 bar() 的库。传入标量值(如 double、int 等)时的作用与传入非标量值(在所有预期情况下,用户定义类型)时发生的情况不同。所以我写了这样的代码:
问题出在 main() 的第二行。此代码的结果是“T”的输出。编译器更喜欢模板而不是对 bar(double) 的调用,我假设这是因为参数是 int,它宁愿将其强制转换为 int const&(因为 const& 可以引用 r 值)。
我的问题是“有没有一种方法可以支持每个标量值而无需明确指出它们?” 我真的不想说出所有可能的类型,因为……嗯……有很多。我必须涵盖从 char 到 long long 的所有内容,包括 volatile 和 unsigned 的每种组合,等等。
我知道只需将 4 更改为 4.0 即可,但这是用于库的公共接口,并且要求用户键入4.0
而不是4
很脏。
c++ - 编译器可以告诉我它选择了哪个重载或模板函数吗?
特别是在 linux 上使用 g++,有没有办法确定为特定语句选择了哪个重载或模板函数?
更具体地说,我不认为我一定知道所有可能的选择,它们可能在来自各种库的头文件中。即使我这样做了,我也不认为我可以修改相关代码。