相关文章
更多最近更新
更多error C2668: 'M' : ambiguous call to overloaded function
2019-03-25 13:50|来源: 网路
以下是代码:
错误提示为:error C2668: 'M' : ambiguous call to overloaded function
为什么呢?
另外在第十一行 u=M(5.0,6.0); 中如果把 5.0、6.0 分别换成 5、6 就不会报错了,为什么呢?
#include<iostream> using namespace std; int M(int a,int b); float M(float a,float b); char M(char a,char b); int main() { float u; u=M(5.0,6.0); cout<<u<<endl; return 0; } inline int M(int a,int b) { return a>b?a:b; } inline float M(float a,float b) { return a>b?a:b; } inline char M(char a,char b) { return a>b?a:b; }
错误提示为:error C2668: 'M' : ambiguous call to overloaded function
为什么呢?
另外在第十一行 u=M(5.0,6.0); 中如果把 5.0、6.0 分别换成 5、6 就不会报错了,为什么呢?
相关问答
更多-
你传递一个int给这个重载函数。 尽管人类的直觉认为ambig(signed long)应该是首选的,因为你的输入是一个负整数(不能用unsigned long整型表示),这两个转换实际上在C ++的“优先”中是等价的。 也就是说, int → unsigned long转换被认为与int → signed long一样有效,并且两者都不是优先于另一个。 另一方面,如果你的参数已经是一个long而不是一个int ,那么就有一个完全匹配的 signed long ,不需要转换。 这避免了含糊不清 。 void ...
-
查看来自gcc的错误消息: a.cpp:16: error: call of overloaded ‘function(double, double)’ is ambiguous a.cpp:3: note: candidates are: void function(int, int) a.cpp:9: note: void function(float, float) 对任何一个函数的调用都需要截断,这就是为什么两者都不优于另一个。 我怀疑你真的想要void funct ...
-
在VS2013中使用可变参数模板时“模糊调用重载函数”(“ambiguous call to overloaded function” when using variadic templates in VS2013)[2022-02-26]
这是不明确的,因为参数包Interfaces...可能是空的。 确保至少采用一个参数加上一些额外的(可能为零)参数。 将第二种方法更改为: templatebool TryQueryInterfaces( IUnknown* in_toQuery, REFIID riid, void **ppvObject, ComObject* in_parent, ... -
'boost :: make_shared':对重载函数的模糊调用('boost::make_shared' : ambiguous call to overloaded function)[2024-04-29]
当您使用关键字auto时,我假设您使用的是C ++ 11功能。 C ++ 11还附带了std::make_shared 。 所以,请尝试添加命名空间: auto portal = std::make_shared( portalVertices, target ); 要么 auto portal = boost::make_shared ( portalVertices, target ); 所以我通常在我的代码/ .C文件中做的是: using namespace std ... -
对函数的模糊调用(Ambiguous call to a function)[2023-05-29]
因为你的电话兼容: templatevoid allocate_help(const Argument& arg,Int2Type )const; 使用Exception = std::bad_alloc和Argument = std::bad_alloc (自动推断出Argument ),并且: template void allocate_help(const Exception& ex, ... -
那是因为另一个函数将第二个参数作为默认参数 。 看到这里我模拟了相同的效果。 不幸的是编译器没有在错误消息中显示默认参数: //intl.h const wxChar *wxGetTranslation(const wxChar *c1, const wxChar *c2 =
); 更确切地说, void foo (const char* c1); // 1st void foo (const char* c1, const char *c2 = 0); // 2nd 当你试图 ... -
我认为这是因为在较新版本的C++ , sqrt被重载(参数可能是double , float或long double ),并且你传入一个int。 只需提出double的论点来说清楚: int finalBit = sqrt( (double) (sieve.size()) ) + 1; I think that is because in newer versions of C++, sqrt is overloaded (argument can be double, float or long dou ...
-
这看起来像MSVC和GCC中的一个错误。 该呼叫应该解决第二次重载(Clang和EDG正在这样做)。 对于调用B::func(g, dt, bx) ,名称查找找到两个func模板。 对它们中的每一个执行模板参数推导和替换,以便生成随后可以参与重载解析的函数模板特化声明。 这两个模板的演绎都成功了,我们剩下两个专业: void B::func
, int>>(const G , int>&, const DT *, BX &); voi ... -
选择与normed_eigval一致的任何一个,因为它决定了您正在使用的数字精度。 您将把ptrdiff_t整数转换为浮点值,然后取其对数。 可能你可以预先计算对数的倒数,如果你需要它更快。 Choose whichever one agrees with normed_eigval because that determines the numeric precision you're working with. You will be converting the ptrdiff_t integer i ...
-
'void a(foo)'[使用参数依赖查找找到] 好吧,令人惊讶的是,MSVC有一个非常好的错误说明: 遵循标准 ,在函数内部,编译器在当前命名空间和命名空间中查找符号类型的符号。 在第一种情况下, a位于foobar并且在参数类型为foo的命名空间中:全局命名空间,使其不明确。 在第二种情况下, a在foobar但不在参数类型bar::foo的名称空间中:with是bar 。 'void a(foo)' [found using argument-dependent lookup] Well, surp ...