草庐IT

c++ - 重载可变参数模板的固定参数

是否可以通过更改函数参数包之前的固定参数数量来覆盖可变参数模板?例如:#includetemplatevoidfoo(std::string,std::string,std::string,Args...){std::coutvoidfoo(std::string,std::string,Args...){std::cout运行它会导致调用第二个foo,但我希望调用第一个。有没有更好的方法重载这个函数? 最佳答案 选择第二个变体是因为它不涉及为最后一个参数创建std::string实例所需的额外转换。如果您显式调用类构造函数(或调整

c++ - `nullopt` 可以作为非类型模板参数传递吗?

考虑以下代码示例#include#includestd::experimental::optionaldflt(42);template&Dflt>voidfoo(){if(Dflt){std::cout();//();//我想要实现的是将nullopt作为非类型函数模板参数传递,但它不会编译。不过,它与具有静态存储的全局变量dflt一起使用。编译器错误信息如下所示:foo.cc:Infunction‘intmain()’:foo.cc:13:34:error:nomatchingfunctionforcallto‘foo()’foo();^foo.cc:7:6:note:candid

c++ - 为什么模板类的成员需要通过其模板类的参数进行参数化

在Stroustrup的书(第4版-首次打印)的第668页,您会找到以下模板类示例吗?templateclassString{public:String();...private:intsz;C*ptr;};作者在第679页写道:Membersofatemplateclassarethemselvestemplatesparameterizedbytheparametersoftheirtemplateclass.Whensuchamemberisdefinedoutsideitsclass,itmustexplicitlybedeclaredastemplate.Forexample

c++ - 模板特化 enable_if

我正在尝试以这种方式专门化模板:classPropertyBase{public:SfPropertyBase(stringname){Name=name;}virtual~SfPropertyBase(){}stringName;virtualboolFromString(Object*obj,stringstr)=0;};templateclassProperty:publicSfPropertyBase{public:Property(stringname):SfPropertyBase(name){//specifictoPropertystuff}templatetypena

函数模板参数的C++模板实例化

我在使用模板实例化[*]时遇到以下问题。文件foo.hclassFoo{public:templatevoidfunc(Ff)private:intmember_;};文件foo.cctemplateFoo::func(Ff){f(member_);}文件caller.ccFoo::func(boost::bind(&Bar::bar_func,bar_instance,_1));虽然编译正常,但链接器提示undefinedsymbol:voidFoo::func如何实例化函数Foo::func?因为它需要一个函数作为参数,所以我有点困惑。我尝试在foo.cc中添加一个实例化函数,因为

c++ - 在模板类中定义迭代器时出现 STL 编译错误

下面的代码给出了错误:error:type‘std::list>’isnotderivedfromtype‘Foo’error:expected‘;’before‘iter’#includetemplateclassFoo{public:std::list::iteratoriter;private:std::listelements;};为什么这是正确的? 最佳答案 你需要typenamestd::list::iterator.这是因为list取决于模板参数,因此编译器无法知道名称iterator到底是什么它将在其中(好吧,从技术

c++ - 虚拟方法和模板类

我解决了一个问题,我认为是一个非常具体的问题。我有2个类,一个Bseclass和一个D派生类(来自Baseclass)。B是一个模板类(或类模板)并且有一个纯虚方法virtualvoidwork(constT&dummy)=0;D派生类应该重新实现这一点,但是因为D派生自B而不是D是另一个模板类,编译器向我吐槽虚函数和模板不能同时工作。有什么想法可以实现我想要的吗?我非常感谢任何想法和想法,特别是如果你已经解决了那个问题这个类是按原样固定的,我不能在不破坏现有代码库的情况下编辑它templateclassB{public:...virtualvoidwork(constT&dummy)

c++ - 模板子类覆盖父类的虚函数

下面的代码是用gccv4.3.3编译的,模板化的子类似乎覆盖了父类中的虚函数,但这是否违反了不能有虚模板函数的规则?还是发生了其他我不明白的事情?classBaseClass{public:virtualvoidFunc(intvar){std::coutclassTemplateClass:publicBaseClass{public:usingBaseClass::Func;virtualvoidFunc(TTvar){std::coutb;BaseClass*c=newTemplateClass;intintVar=3;doubledoubleVar=5.5;a.Func(int

c++ - 奇怪的编译器错误和模板继承

谁能解释一下为什么这段代码:classsafe_bool_base{//13protected:typedefvoid(safe_bool_base::*bool_type)()const;voidthis_type_does_not_support_comparisons()const{}//18safe_bool_base(){}safe_bool_base(constsafe_bool_base&){}safe_bool_base&operator=(constsafe_bool_base&){return*this;}~safe_bool_base(){}};templatec

C++ 模板偏特化错误

下面的代码给我一个编译错误:classQ64isnotavalidtypeforatemplateconstantparametertemplateINLINETgrid_residue(Tamount){Trem=amount%(GRIDD);if(rem>GRIDD/2)rem-=GRIDD;returnrem;}templateINLINEQ64grid_residue(Q64amount){returnQ64(grid_residue(to_int(amount)));}怎么了?我正在努力专注grid_residue上课Q64.更新:更改语法。现在出现错误error:funct