问题标签 [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 投票
4 回答
7177 浏览

c++ - 如何解决使用文字 0 和指针调用重载函数的歧义

我很确定这一定已经在这里了,但是我没有找到很多关于如何解决这类问题的信息(没有在通话中进行投射):

给定两个重载,我希望带有文字 0 的函数调用始终调用 unsigned int 版本:

我理解为什么会发生这种情况,但我不想一直写 func( 0u ) 甚至 func( static_cast(0) ) 。所以我的问题是:

1)一般有推荐的方法吗?

2)按照以下方式进行操作有什么问题吗?这样做的原因是什么?

0 投票
2 回答
710 浏览

c++ - 具有选择了非常量引用的复制构造函数的参数类型的函数?

前段时间,当我想编写一个is_callable<F, Args...>trait 时,我对某些代码的以下行为感到困惑。重载解析不会调用通过非常量 ref 接受参数的函数,对吗?为什么它不拒绝以下因为构造函数想要一个Test&?我预计它会采取f(int)

错误信息是

你能解释一下为什么一个有效而另一个无效吗?

0 投票
2 回答
533 浏览

c++ - 无用(可能是错的?) gcc 错误消息

我只花了几个小时调试一个编译器错误,如果编译器的错误消息更有帮助,我可以立即修复它。

我把它简化为一个简单的例子:

错误是:

这个错误在最好的情况下不是误导,在最坏的情况下是完全错误的吗?在我看来,问题在于给定的 g 定义与调用不匹配,而是该定义格式错误(因为在 decltype 中的表达式 f(x) 中,它尝试调用 f 而不指定f 的模板参数)。

一个更合理的错误消息不会是这样的:

甚至更好:

我会期待这样的事情......

0 投票
2 回答
373 浏览

c++ - 模板函数重载未按预期调用

我的情况如下:

我有一个模板包装器,它可以处理值和对象可以为空的情况,而无需手动处理指针甚至new. 这基本上归结为:

现在使用比较运算符,我可以检查null_t虚拟对象,以便在实际尝试检索值或将其传递给需要该值并进行自动转换的函数之前查看它是否设置为 null。

这门课在很长一段时间内对我很有帮助,直到我偶然发现了一个问题。我有一个包含一些结构的数据类,这些结构将全部输出到一个文件(在本例中为 XML)。

所以我有这样的功能

每个都用适当的数据填充 XML-DOM。这也可以正常工作。

然而,现在这些结构中的一些是可选的,在代码中将被声明为

为了处理这种情况,我做了一个模板重载:

在我的单元测试中,正如预期的那样,编译器总是更喜欢选择这个模板函数,无论值或结构包含在nullable<T>.

但是,如果我使用上述数据类(在其自己的 DLL 中导出),由于某种原因,第一次应该调用最后一个模板函数,而是完成从nullable<T>到相应类型的自动转换T,完全绕过函数意味着来处理这个案子。正如我上面所说的——所有单元测试都 100% 正常,测试和调用代码的可执行文件都是由 MSVC 2005 在调试模式下构建的——这个问题绝对不能归因于编译器的差异。

更新:澄清 - 重载Add函数不导出,仅在 DLL 内部使用。换句话说,遇到这个问题的外部程序甚至不包括带有模板重载函数的头部。

0 投票
2 回答
1548 浏览

c# - 关于泛型和 IEnumerable 的方法重载解决方案

前几天我注意到了这一点,假设您有两个重载方法:

这段代码:

印刷:

在这些情况下,Person[]为什么比他们List<Person>更好地匹配?TIEnumerable<T>

谢谢,

更新: 另外,如果你有另一个超载

Print(persons.ToList());实际上会打印List T而不是Single T.

0 投票
2 回答
5103 浏览

c# - 方法重载解析系统如何决定在传递空值时调用哪个方法?

因此,例如,您有如下类型:

这里我只是给出了使用构造函数的例子,但是如果它们是类型本身的非构造函数方法,结果将是相同的,对吧?

所以当你这样做时:

哪个构造函数会被调用,为什么?

我可以自己对此进行测试,但我想了解重载解决系统是如何工作的(不确定这是否就是所谓的)。

0 投票
2 回答
2578 浏览

c# - 重载的方法组参数混淆了重载解析?

以下对重载Enumerable.Select方法的调用:

失败并出现歧义错误(为清楚起见删除了命名空间):

我当然可以理解为什么明确指定类型参数会导致模棱两可(两种重载都适用),但这样做之后我看不到一个。

对我来说似乎很清楚,目的是调用第一个重载,方法组参数解析为Tuple.Create<char>(char). 第二个重载不应该应用,因为没有一个 Tuple.Create重载可以转换为预期的Func<char,int,Tuple<char>>类型。我编译器被 混淆了Tuple.Create<char, int>(char, int),但它的返回类型是错误的:它返回一个二元组,因此不能转换为相关Func类型。

顺便说一句,以下任何一项都会使编译器高兴:

  1. 为方法组参数指定类型参数:(Tuple.Create<char>也许这实际上是一个类型推断问题?)。
  2. 使参数成为 lambda 表达式而不是方法组:x => Tuple.Create(x)Select(在通话中使用类型推断效果很好)。

不出所料,尝试以Select这种方式调用另一个重载也会失败:

这里的确切问题是什么?

0 投票
3 回答
1742 浏览

c++ - 重载分辨率和数组:应该调用哪个函数?

考虑以下程序:

f应该叫哪个?为什么?

三个编译器的最新发布版本不同意这个问题的答案:

  • (1)使用g++ 4.5.2编译程序时调用
  • (2)在使用Visual C++ 2010 SP1编译程序时调用
  • (3)使用Clang 3.0 (trunk 127530)编译程序时调用

重载解决规则在不同的 C++0x 草案中是否发生了重大变化?或者,这些编译器中的两个真的完全错误吗?根据最新的 C++0x 草案,哪个重载是正确的重载?

0 投票
3 回答
1473 浏览

c# - 避免泛型类型的模棱两可的调用错误

我正在制作一个双向字典类,以允许我在任一方向上进行快速查找。

我的班级(部分)看起来像这样:

我在这个例子中使用了数组索引运算符,但几乎每个方法都有两个通用版本。除了A == B 的情况外,它工作得很好。

如果我做

由于索引器不明确,它甚至无法编译。

我理解为什么编译器对此有问题,并且我同意它可能不合法。

假设我实际上有一个需要 a 的有效用例DoubleDictionary<int,int>,并且我任意选择数组索引应该访问正向字典。

我为解决所有这些问题而得出的解决方案是为每个方向的唯一命名方法放弃光滑的索引语法。这使它变得不那么神奇,也不那么有趣。

有没有办法给编译器提示来解决歧义,而不必求助于唯一命名的方法?我真的很喜欢用重载来做这个的想法,并希望保持这种状态。我宁愿在课堂上这样做,这样调用者就不必担心它,但我想调用者必须做某种反射魔法才能让它工作。

如果不可能的话,我会很好地限制 A 不能与 B 相同。有没有办法对此进行编码,以便声明DoubleDictionary<int,int>不会编译?我可以在构造函数中抛出异常,但如果它在编译时被捕获就更好了。

0 投票
4 回答
692 浏览

c++ - C++0x 与 using 声明的混淆

这种情况应该发生什么:

感兴趣的线是 f()。显然f根据10.2FDIS 的查找成功并找到A::f。但是,超载决议会考虑哪些候选人?规范说13.3.1p4

对于通过 using 声明引入派生类的非转换函数,该函数被认为是派生类的成员,以便定义隐式对象参数的类型。

这样做的目的是,对于单个类,如果此类包含自己的成员函数和将基类函数的名称带入作用域的 using 声明,则在重载决策期间,所有候选函数在其隐式对象中具有相同的类类型范围。但这对上面的例子意味着什么?候选人会是以下吗?

这似乎是错误的,因为我们在查找结果集中只有一个声明10.2p7。我们该如何解释这个??