草庐IT

overloading

全部标签

C++ 可变参数模板在虚拟抽象的外部未解析

今天我为我的项目编写代码,并在链接器外部遇到Unresolved问题,代码必须生成具有多个虚拟抽象方法的类-作为类集合的基础。所以我决定为此任务使用可变参数模板-但出现了错误。templatestructpin_tag{};//inputstemplateclassinputs_base:publicinputs_base{protected:typedefinputs_basebase_type;usingarg_type=T0;//usingbase_type::_in;virtualvoid_in(T0const&t,pin_tag)=0;};templateclassinput

c++ - 模棱两可的调用 : int to double or bool

我有一个参数类,我重载了构造函数以接受bool值或double值。当你给它一个int时,它无法构建:errorC2668:'Parameter::Parameter':ambiguouscalltooverloadedfunctioncouldbe'Parameter::Parameter(std::string,std::string,double)'or'Parameter::Parameter(std::string,std::string,bool)'我相信我有两个选择:使用int默认值重载将我的变量显式转换为double我有很多参数,其中一些是无符号长整型、float等(在多

c++ - 编译器如何选择正确的重载函数?

我有一个具有以下构造函数的类:Color(constfloatred=0.0f,constfloatgreen=0.0f,constfloatblue=0.0f,constfloatalpha=1.0f);Color(constunsignedcharred,constunsignedchargreen,constunsignedcharblue,constunsignedcharalpha);Color(constunsignedlongintcolor);如果我这样调用它:Colorc{0.0f,1.0f,0.0f,1.0f};一切正常。但是如果我调用它:Colorc{78,180

C++11统一初始化和函数重载

简单程序:voidf(conststd::string&s);voidf(constchar*p);f({});为什么clang调用f((constchar*)nullptr)?我已经预料到编译器会发出关于不明确调用的警告。 最佳答案 这包含在C++11标准草案13.3.3.1.5[over.ics.list]中,它说:Otherwise,iftheparametertypeisnotaclass:[...]iftheinitializerlisthasnoelements,theimplicitconversionsequence

模板参数上的 C++ 函数模板重载

是否可以像这样重载函数模板(仅在使用enable_if的模板参数上):template::value>>voidfn(Tt){}template::value>>voidfn(Tt){}如果enable_if中的条件不重叠?我的MSVS编译器提示说,'voidfn(T)':functiontemplatehasalreadybeendefined。如果不是,替代方案是什么(最好不要将enable_if放在模板参数以外的任何地方)? 最佳答案 默认参数在确定函数的唯一性方面不起作用。所以编译器看到的是您定义了两个函数,例如:templ

c++ - 如何编写接受每个类和类模板的 C++ 模板?

预先警告:这个问题似乎比实际情况更明显。我想编写一个可以接受任何具体类或模板类作为模板参数的模板。这可能看起来毫无用处,因为如果不知道传入的T是否已模板化,您将不知道如何使用它。我想要这个的原因是我可以声明一个没有定义的通用模板,然后用户可以专门化。因为用户是特化的,所以他们总是知道他们正在处理的类型。但是,如果不先声明模板,用户就无法特化模板。你可以这样做:templateclassmyclass;但是如果你传入一个模板化的T,那将不起作用,例如myclass不会工作。那么我们试试这个:templateclassmyclass;templateT>classmyclass;这可能是正

C++ 隐式转换和重载函数调用中的歧义

我面临以下问题:我有一个类V(比如一个vector),我可以从中生成两个类:CI和I(想想const_iterator和迭代器)。如果我有一个constV,那么我只能生成CI(再次想到iterator和const_iterator)。本质上,我想用(CIci)替换(constV&v),用(Ii)替换(V&v)。此外,我仍然希望能够将Vobj直接传递给需要I或CI的函数,从而实现从V和constV到CI和I的隐式转换。我面临的问题是,虽然重载函数可以区分(constV&v)和(V&v),但当我传递Vobj时,它们无法“区分”(CIci)和(Ii)。在代码中:structV{};struc

c++ - 如何判断调用了哪个重载函数?

#include#includeusingnamespacestd;floatf(inta,intb){return(a+b);}floatf(floata,floatb){return(round(a+b));}intmain(){cout为什么最后一个输出使用f的第二个定义?一般来说,当函数定义和函数调用之间的参数数量和类型不完全匹配时,如何确定将使用哪个重载函数定义? 最佳答案 在尝试确定标准中为什么一个重载优先于另一个重载后,我得出的结论是不应该,在f(int1,float2)并且代码不应编译。如果您的编译器接受它,则可能在

c++ - 为什么 cmath 不使用模板和/或重载

TR1在C++11中引入的许多新函数都有丑陋的类C签名。例如,引用Boost的TR1文档(http://www.boost.org/doc/libs/1_52_0/doc/html/boost_tr1/subject_list.html#boost_tr1.subject_list.special)://[5.2.1.1]associatedLaguerrepolynomials:doubleassoc_laguerre(unsignedn,unsignedm,doublex);floatassoc_laguerref(unsignedn,unsignedm,floatx);longd

c++ - 重载函数以接受模板指针变量

在main函数中调用时使用push方法。然而,即使主函数中的参数是一个指针,它仍然使用函数voidPush(constDATA_TYPE&newValue)。它不应该使用另一个接受指针的那个吗?如果有指针变量,如何更改第二个函数中的参数以覆盖第一个函数?templatevoidPush(constDATA_TYPE&newValue){//dostuff}templatevoidPush(constDATA_TYPE*newValue){//dostuff} 最佳答案 您的问题与常量有关。问题是,当您使用非常量对象指针调用Push(