草庐IT

overload-resolution

全部标签

c++ - 为什么这些重载不是模棱两可的?

以下代码使用gcc和clang编译良好。templatestructidentity{typedefTtype;};templatevoidfoo(typenameidentity::type);templatevoidfoo(T);intmain(){foo(0);}看起来重载解析正在选择第一个重载(identity::type一个)。有人可以解释为什么重载没有歧义吗?据我所知,它们之间的唯一区别是第一个参数是非推导上下文而第二个参数不是,但是由于我明确提供了模板参数,所以我不明白为什么这很重要。 最佳答案 两种重载都是可行的,但

c++ - 多维数组 : operator overloading

我有一个包含多维数组的类:可以用这个类创建一维、二维、……、n维数组如果数组有n维,我想使用noperator[]来获取一个对象:例子:Aa({2,2,2,2}];a[0][1][1][0]=5;但数组不是指向其他vector等的指针vector...所以我希望operator[]返回一个类对象直到最后一个维度,然后返回一个整数这是一个大大简化的代码,但它显示了我的问题:我收到的错误:[Error]cannotconvert'A::B'to'int'ininitialization"#include//nullptr_t,ptrdiff_t,size_t#include//cin,co

c++ - 错误 : call of overloaded ‘max(int, int)’ is ambiguous

#includeusingnamespacestd;templateTmax(Tlhs,Trhs){returnlhsintmax(intlhs,intrhs){returnlhs(4,5)如何更正此错误? 最佳答案 这都是因为你的usingnamespacestd;。删除该行。通过该using指令,您将std::max(必须通过iostream以某种方式包含)带入全局范围。因此,编译器不知道调用哪个max-::max或std::max。我希望这个例子对于那些认为使用指令是免费的的人来说是一个很好的稻草人。奇怪的错误是一种副作用。

c++ - 调用函数的歧义。隐式转换?

#includevoidf(std::string&&rref){}voidf(std::strings){}intmain(){std::strings="s";f(std::move(s));}此代码导致歧义,我不知道为什么,也许,我明确转换为rvalue引用。我的想法是右值引用可以隐式转换为左值。但我不确定。请解释。 最佳答案 std::string可以从std::string类型的右值初始化。所以第二个功能是候选。拥有值和右值引用重载不是一个可行的想法。更正常的设置是具有右值引用和左值引用重载:voidf(std::stri

c++ - 过载解析和用户定义的转换

考虑简单的代码:structA;structB{B(){}B(Aconst&){}};structA{operatorint()const{return0;};};voidfunc(B){}voidfunc(char){}intmain(){func(A());//ambiguouscalloO}首先,我不确定我是否理解正确,所以请随时纠正我。我的理解是应该选择voidfunc(B),因为func的参数是A,它是类类型,因此所需的转换类型是“用户定义的转换序列”现在来自IBMC++引用:Auser-definedconversionsequenceconsistsofthefollow

c++ - C++ 重载解析规则中的缺陷?

考虑以下代码:#includenamespacens1{structA{};templatestd::ostream&operatorstd::ostream&operator按照标准,编译失败并出现“不明确的重载错误”。但是为什么?A的“home”命名空间中的“同样好”的运算符肯定应该优先吗?有什么合乎逻辑的理由不这样做吗? 最佳答案 如果您希望namespaceA中的重载成为首选,那么您必须向其中添加一些内容以使其实际上更好。比如说,通过使其不是模板:namespacens1{std::ostream&operator否则,如果

c++ - 不同类的构造函数重载解析

考虑这段代码。structA{inti;};structB{charc;};structC{doubled;};voidf(Aa);voidf(Bb);voidf(Cc);voidg(){f({5});}这里我在f({5});中遇到了歧义。但是好像structA的构造函数是完全匹配{5}的,而第二个需要整数提升,而最后一个需要float转换。那么为什么会出现歧义呢? 最佳答案 即使序列中的第一个转换排名较差,两个转换序列最终都是用户定义的转换,因为它们都转换为用户定义的类型。[over.ics.user]1Auser-defined

c++ - 具有两个参数包的函数模板重载决议

考虑以下代码:#includetemplateintf(T...){return1;}templateintf(T...){return2;}intmain(){std::cout它在gcc8.2上编译并打印1,但在clang7上编译失败,因为调用f(1)不明确。如果调用被f()替换,两个编译器都无法编译,声称调用不明确。如果参数包class...T被替换为简单参数classT(并且T...替换为T),两个编译器也声称有歧义。第一个例子中哪个编译器符合标准?我想这归结为函数模板的特定部分排序规则,或者以这种方式使用双参数包是否已经不正确?编辑:我的理解是双包本身不是格式错误的,因为如果

c++ - 谷歌模拟 : Mocked overloaded functions create warning C4373

我正在使用GoogleMock模拟一个具有2个重载函数的C++类和VS2010:#include"stdafx.h"#include"gmock/gmock.h"#include"A.h"classMockA:publicA{public://...MOCK_METHOD3(myFunc,void(constintid,constinterrorCode,constCStringerrorMsg));MOCK_METHOD1(myFunc,void(constCStringerrorMsg));//...};每次编译我都会收到两次以下警告:1>c:\dev\my_project\tes

c++ - 是 C++ * 运算符 "already overloaded?"

我的C++老师认为标准C++中的*运算符“已经过载”,因为它可能表示间接或乘法,具体取决于上下文。他从C++PrimerPlus中得到了这个,其中指出:Actually,manyC++(andC)operatorsalreadyareoverloaded.Forexample,the*operator,whenappliedtoanaddress,yieldsthevaluestoredatthataddress.Butapplying*totwonumbersyieldstheproductofthevalues.C++usesthenumberandtypeofoperandsto