问题标签 [ambiguous-call]

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 投票
2 回答
1920 浏览

c++ - 文字 `0` 是 int 和 const string& 重载的有效候选者会导致模棱两可的调用

我最近修复了一个错误。

在下面的代码中,重载函数之一是 const 而另一个不是。该问题将通过将两个函数设为 const 来解决。

我的问题是为什么编译器只在参数为 0 时才抱怨它。

0 投票
1 回答
41 浏览

java - Exact overload resolution procedure - why f(1) call against f(int... arg) and f(long... arg) is not ambiguous?

I feel that these are applicable:

JLS 15.12.2.4. Phase 3: Identify Methods Applicable by Variable Arity Invocation

JLS 15.12.2.5. Choosing the Most Specific Method

But JLS language is so complex that I cannot understand the point.

I seemingly understand that one (besides this was ALREADY ANSWERED here), though the answer did not describe all the details (the exact sequence - what arguments are tried) of the entire overload resolution process - anyway my question is mainly in the second code snippet (int.. vs long...). But let me go into details of the above snippet:

f((short)1) - no exact match, so primitive short is first widened (no match found), then short is boxed into Short (no exact match found), Short is widened (Number, Object) - no match, now comes the third phase (varargs) => the following is tried:

  • short... (no exact match => try primitive widening)
  • int... (exact match found, but don't stop, search further!)
  • long..., float..., double... (no match => try boxing)
  • Short..., Number..., Object...

As no other match found - it compiles OK.

f(1) - no exact match, so primitive int is first widened (no match found), then int is boxed into Integer (no exact match found), Integer is widened (Number, Object) - no match, now comes the third phase (varargs) => the following is tried:

  • int... (exact match found, but don't stop, search further!)
  • long..., float..., double... (no match => try boxing)
  • Integer... (now ambiguous), Number..., Object...

As two possible matches found - we have a compile Error.

f(byte) - as comes the third phase (varargs) => the following is tried:

  • byte... (no match => try primitive widening)
  • short..., int... (match found, but look further), long... (shall be ambigouos error, but it is not!), float..., double... (now also do boxing with subsequent reference widening to look for more possible matches to flag compile error "ambiguous")
  • Byte..., Number..., Object...

As two possible matches found - shall be a compile Error (but it is not).

My guess is that there are 4 procedures (exact primitive match, primitive widening, boxing and exact reference match, reference widening) and the compiler stops if it found a match during some procedure (the procedure is not continued), but tries all other subsequent procedures. In this case compiler stopped at procedure 2 (only int... matches, but not long...), procedures 3 and 4 yielded no match.

The above-quoted answer on SO offers the following criteria:

for one parameter to be more specific than the other, the type of that parameter must be a subtype of the other method's parameter.

It may work for reference types, but not in case of primitives.

I seem to understand 15.12.2. Compile-Time Step 2: Determine Method Signature. But in my case we have "The third phase (§15.12.2.4) allows overloading to be combined with variable arity methods, boxing, and unboxing." - but the detailes of this is the problem.

enter image description here enter image description here enter image description here

0 投票
1 回答
738 浏览

c# - C# 使用动态 lambda,但在选择要使用的方法时获得模棱两可的匹配

根据 Pasov 的博客文章,我有以下静态方法用于在过滤器选项之间进行选择。

一旦到达该行return Expression.Call(member, startsWithMethod, constant);,就会引发以下错误:

如果我注释掉private static MethodInfo containsMethodprivate static MethodInfo endsWithMethod现在可以工作。

我发现这篇文章的答案(同样的问题)说要使用这个重载,但它已经这样做了。

我怎样才能避免这种情况,以便它可以在不同的方法之间进行选择而不会看到模棱两可的选择?

0 投票
1 回答
307 浏览

c# - 对 UseHttps 扩展方法的模糊调用

在我的 ASP.NET Core 3.1 项目中,我有以下配置Program.cs

参考包:

编译它会产生以下错误消息:

...这对我来说没有多大意义。

我怎样才能解决这个问题?

0 投票
1 回答
122 浏览

c++ - 对“距离”的错误引用不明确

我无法弄清楚为什么我收到错误“ reference to 'distance' is ambiguous”。
我已将类对象作为朋友函数中的参数传递。

0 投票
1 回答
77 浏览

c++ - 将类(mixin)的功能与模棱两可的调用结合起来

我正在阅读 C++ 中的“mixin”技术,但有一些我不明白的东西,似乎是语言的一个限制,由于编译器的歧义(和标准拒绝解决,甚至如果可以的话)。

mixin 的想法是聚合来自不同部分的能力。有时可以用相同的名称调用这些功能,因为它们通常做同样的事情。

我可以将这两个类的服务与

但是,当我使用它时,我得到一个编译错误:“对成员 'f' 的请求不明确”(godbolt 链接)

因此,编译器知道f存在,但它拒绝解析哪个是正确的调用。它会生成此错误:

当然,我可以更改课程并使用这个成语“带来完整的f重载版本”。

它有效,但问题是CombineAB不能通用。最接近的是:

但我不能不添加 的等价物using T1::f; using T2::f,首先因为combination需要了解 T1、T2 中所有可能的功能。

因此,似乎需要根据具体情况定义组合。例如与

这违背了目的,因为如果 T1 和 T2 提供 20 个具有相同名称的函数(如我的情况),则该类将需要重复所有这些函数名称。最糟糕的是,它不能通过额外的模板参数来完成(可以吗?)。

这是在 C++ 中组合类的正确方法吗?是否有解决方法,或者这只是对问题的过于幼稚的看法?如有必要,我愿意接受涉及大量模板代码的选项。


即使实例化不是等式的一部分并且f是静态函数,问题仍然存在。似乎该语言对更改或组合基类中成员函数的含义有强烈的感觉。

0 投票
8 回答
1247 浏览

java - “冗余转换为 java.lang.Object”警告必要转换

考虑这个最小的,可重现的例子

(接近最小,true是一个有用的布尔表达式的替代品。我们可以忽略第一个? :(在实际代码中,有很多)。)

这“显然”给出了错误。

好的,让我们修复它。这是String.valueOf(Object)我想要的超载 - 我以后可能想添加:

(事实上​​,我之前确实有类似的东西,但现在已经删除了该功能。)

这给出了警告:

这是编译器警告或错误中的错误,我该如何修复它以使代码合理并且没有警告或错误?

(编辑:我稍微更改了 MRE。throws Throwable来自模板。真正的代码确实使用文字 chars* 并且String.valueOf在其他地方它使用了String.valueOf(char)重载,所以toString()是有问题的(哦 Java!)。代码避免了全局状态,例如System.out, 和symbol并且fail在不同的类中。“开关”是不可枚举的类型。fail是类断言方法的伴侣,这就是它在内部抛出(未经检查的非空)异常的原因。

我实际上是如何修复它的,不相关的是,我重新排列了代码,所以那里也有一些文字字符串。Object.class.cast否则,我会使用(Object). 我真正想知道的是:wtf?

*实际上,真正的真实代码通过不同语言的词法分析器,它不区分文字字符、字符串、各种数字、布尔值、枚举等。为什么会这样?)

0 投票
1 回答
64 浏览

c# - CS0121 含 char、int、double 参数的模糊重载函数调用在 C# 中隐式转换为用户定义类型

我有一些 C# 类,MyChar、Myint、MyDouble,它们包装了 char、int 和 double。每个都有一个从包装类型到用户定义类型的隐式转换运算符。我还有一组重载函数,ToString(MyChar)、ToString(MyInt)、ToString(MyDouble)。

我想通过传入一个文字字符值来调用 ToString(MyChar),例如“A”。但编译失败并出现 CS0121,“以下方法或属性之间的调用不明确:'ToString(MyChar)' 和 'ToString(MyInt)'”。如果我传入一个 int 值,我会遇到类似的问题。

我发现通过添加从 MyInt 到 MyDouble 的隐式转换,我可以使编译器正确接受 int 值

我想这是可行的,因为解析机制现在认为到 MyDouble 的转换现在是通过路线 1 -> MyInt -> MyDouble 进行的,并且这不能隐式发生,因为它需要两个用户定义的转换。同样,我可以ToString('A')通过添加另外两个隐式转换来正确解析:MyChar 到 MyDouble,以及 MyChar 到 MyInt。

这很好,因为它反映了 char、int 和 double 之间发生的隐式转换。但是谁能向我解释为什么上面发布的原始代码在没有额外转换的情况下无法编译,就像我这样的简单大脑可能理解的方式?

0 投票
0 回答
76 浏览

c++ - 在给定参数类型的情况下,如何检查是否隐式使用 `operator ()` 会导致恰好是一个最佳可行候选者?

据我了解,函数名称使用的结果可能是以下之一:

  1. 没有(最好的)可行的功能——重载决议失败。子结果是:
    1. 没有候选人。
    2. 有一些候选人,但没有一个是可行的。
  2. 只有一个最佳可行功能——重载决议成功。然后选择的过载是
    1. 好的——整体调用格式正确。
    2. 不好(= deleted, protected/private或者,也许是别的东西)——整个调用格式不正确。
  3. 最好的可行函数不止一种——重载决议因模棱两可而失败。

问题是:在通过类型特征隐式使用operator ()(ie )的情况下,如何可靠地将结果 #2.2(至少其中一些情况)与结果 #1.2 和 #3(至少其中一个)区分开来c(a...)接受c要在调用中使用的参数类型(包括 )?

(我对结果 #1.1 和 #2.1 不感兴趣,因为我知道 #1.1 不适用于我的特定用例,并且 #2.1 很容易通过 SFINAE 检测到。)


一个具体的例子。如何实现类似于以下内容的类型特征

所以以下断言成立?

请注意,通常对参数和参数的类型一无所知。