草庐IT

TEMPLATE

全部标签

c++ - C++ 的什么特性允许模板类在没有模板参数的情况下引用它们自己?

给定:templateclassC{C&operator++(){...}};为什么/怎么样C允许声明C类型的变量和函数而不是被要求命名C?在处理包含许多参数的模板之前,我并没有真正考虑过这个问题,因为这会使拼写“self类型”变得不方便。有什么我应该知道的怪癖吗? 最佳答案 [n3290:14.6.1/1]:Likenormal(non-template)classes,classtemplateshaveaninjected-class-name(Clause9).Theinjected-class-namecanbeuseda

c++ - 这是一个 VC++2010 编译器错误吗?

使用VisualStudio2010SP1:#include//namespaceXXX{structTest{booloperator==(constTest&r)const{returntrue;}};//}//typedefXXX::TestTest;templateinlinebooloperator!=(constT&l,constT&r){return!(l==r);}intmain(){std::vectorvt;std::vectorvt2=std::move(vt);return0;}如果我按原样编译上面的代码,它会失败并出现以下错误:1>C:\apps\MVS10\

c++ - 无论如何,有没有根据 C++ 中参数的成员来专门化模板?

有没有办法特化像这样的模板,使特化仅在T具有成员函数hash时适用?(请注意,这只是我正在尝试做的一个例子。我知道对于每个具有hash函数的类来说,在operator中自行检查它会更有意义==成员函数,但我只想知道这种事情是否可能。)templateboolequals(constT&x,constT&y){returnx==y;}template//somehowcheckifThasamemberfunction'hash'boolequals(constT&x,constT&y){returnx.hash()==y.hash()&&x==y;}如果可能的话,我更喜欢C++11之前

c++ - 内置数组大小的类型是多少?

当推导一个非类型模板参数时,比如n,n的类型必须在参数和实参之间完全匹配。所以下面的代码不会编译(至少在GCC和clang上):#includetemplatevoidf(std::arrayconst&){}intmain(){std::arrayarr;f(arr);}这是因为std::array声明为templateclassarray;而不是templateclassarray;但是,要捕获内置数组的大小,似乎任何整型都可以。以下所有关于GCC、clang和VC++的工作:templatevoidf(T(&)[n]);templatevoidf(T(&)[n]);templat

c++ - 这是模板的正确行为吗?

templateblahfunc(blehp){//Dosomething}intmain(){doubled=1.111;inti=func(d);//#1intj=func(d);//#2//....}在这个例子中,func的实例#1和#2都在编译,但我不确定什么是正确的,以及为什么。有人可以解释为什么#1是正确的,并可能提供一些背景吗? 最佳答案 是的,这是正确的行为。案例1——类型推导func(d);这使用templatetypededuction确定bleh的类型。Inordertoinstantiateafunction

c++ - 通过 using 指令公开私有(private)继承的内部模板

我正在尝试使用using引入public的指令派生类的访问声明一些在基类中声明的内部类模板。代码:templateclassBase{public:templatestructInner;};templateclassDerived:privateBase{public:usingtypenameBase::templateInner;//makeitvisibleInner*ptr;//noneedfortypenamehere,non-qualifiedname};intmain(){}g++和clang++都不编译这段代码,都提示error:expectedunqualified

c++ - std::function/bind 就像没有标准 C++ 库的类型删除

我正在基于发布/订阅模式使用C++11开发一个简单的事件驱动应用程序。类有一个或多个onWhateverEvent()事件循环调用的方法(控制反转)。由于应用程序实际上是一个固件,其中代码大小很关键,灵active不是高优先级,“订阅”部分是一个包含事件ID和相关处理程序的简单表格。这是一个非常简化的代码:#includeenumEvents{EV_TIMER_TICK,EV_BUTTON_PRESSED};structButton{voidonTick(intevent){/*publishEV_BUTTON_PRESSED*/}};structMenu{voidonButtonPr

c++ - 返回指向成员函数的指针(没有类型定义)

在C++03上编译,我试图编写一个测试模板函数,它返回一个返回int的成员函数的成员函数指针,并接受两个float参数:templateint(TemplateClass::*)(float,float)Testtest(TemplateClass&A){return&TemplateClass::Function;}但很自然地,无论我使用指向成员函数的指针语法的什么变体,编译器都会提示初始化错误。Typedef,虽然它适用于已知的类,但出于显而易见的原因(命名冲突),不会接受我无法提前知道的可能使用相同函数的类的模板类参数。有什么非typedef方法可以让这个函数编译并返回指向成员函

c++ - 防止隐式模板实例化

在这样的方法重载情况下:structA{voidfoo(inti){/*...*/}templatevoidfoo(Tt){/*...*/}}除非明确命令,否则如何防止模板实例化?:Aa;a.foo(1);//oka.foo(1.0);//oka.foo(1);//callsnon-templatedmethoda.foo(1.0);//error谢谢! 最佳答案 你可以介绍一个depedent_type阻止templateargumentdeduction的结构.templatestructdependent_type{using

c++ - 转换模板中的成员函数指针

假设我有以下两个类:templatestructBase{voidfoo();};structDerived:Base{};我能做到:void(Derived::*thing)()=&Derived::foo;编译器很高兴(如我所料)。当我把它放在两层模板中时,它突然爆炸了:templatestructbar{};templatevoidfoo(){bar{};}intmain(){foo();//ERRORfoo>();//Worksfine}这失败了:non-typetemplateargumentoftype'void(Base::*)()'cannotbeconvertedto