草庐IT

template-specialization

全部标签

返回类型的 C++11 方法模板特化

我有以下类(class):classFoo{public:templateTbar(){cout它的调用方式如下:Foofoo;inti=foo.bar();longl=foo.bar();现在我想对使用shared_ptr调用函数的情况进行不同的专门化处理Foofoo;foo.bar>();foo.bar>();但我当然不想为每种类型创建完全特化。是否有可能实现此类行为(如果需要,可以基于特征)? 最佳答案 您不能部分特化函数。有关原因的故事,请查看此GOTW.虽然您可以部分特化类,所以您可以做的是:templateTbar(){

c++ - 如何专门化非模板类的模板成员函数?

假设我有一个文件alpha.h:classAlpha{public:templatevoidfoo();};templatevoidAlpha::foo(){}templatevoidAlpha::foo(){}如果我在多个cpp文件中包含alpha.h并使用GCC4.4编译,它会提示foo有多个定义。和foo跨越多个目标文件。对我来说很有意义,所以我将最后两行更改为:templateexternvoidAlpha::foo(){}templateexternvoidAlpha::foo(){}但是GCC说:explicittemplatespecializationcannothav

c++ - 为什么 C+ +'s <vector> templated class doesn' t 打破了一个定义规则?

也许这是一个蹩脚的问题,但我不明白!如果我包括或在多个翻译单元(不同的.cpp)中,为什么它不破坏ODR?据我所知,每个.cpp的编译方式都不同,因此将为每个目标文件分别生成vector的方法代码,对吧?所以链接器应该检测到它并提示。即使它不会(我怀疑这是模板的特殊情况),当我将所有链接在一起时,它会在每个单元中使用一个代码还是不同的克隆代码集??? 最佳答案 同样,任何模板定义都不会破坏ODR—ODR特别指出,模板定义可以在翻译单元之间重复,只要它们确实是重复的(并且,因为它们是重复,不可能有冲突或歧义)。[C++14:3.2/6

c++ - 当模板template-parameter的模板参数为pack expansion时,gcc失败,clang成功

templatestructS{templatestructA{};templatestructB{};templateclass>structC{};};S::C::B>s1;S::C::A>s2;//gcc5.1.0fails,clang3.6.0succeedsintmain(){}你可以在这里测试http://melpon.org/wandbox/permlink/hhy70gO9LMjLq9nU哪个是正确的,gcc还是clang? 最佳答案 这个问题在gcc6.0中已经解决 关

c++ - 显式函数模板特化 - 为什么?

我一直在阅读和研究不同的帖子、C++书籍、文章,但到目前为止还没有人向我解释过这种结构的合理性。这毫无意义,而且真的很烦我。模板的全部意义在于将类型参数化为函数(或类,但我说的是函数模板,而不是类)。为什么要使用没有类型参数的有趣模板语法???//thisseemsridiculous.whywouldanybodyeverusethis?templatevoidSwap(int&a,int&b){}//IwouldalwaysusethisifIneededtotakecareofaspecialcase,no?voidSwap(int&a,int&b){}我错过了什么?我真的很感激

c++ - 模板基类的子类的模板特化

这个问题有点难以解释,所以我先举个例子:我有一个类模板,它接受一个类型和一个整数常量作为模板参数,并且我有一些子类派生自该模板的实例化:templatestructBase{staticvoiddoSomething(){cout{};我想将这些类与一些其他模板(我们称之为测试)一起使用,这些模板具有针对不同类型的专门化。因为从Base的任何实例派生的所有类的行为应该完全相同,所以我只想定义一个Test特化来处理所有从Base派生的类。我知道我不能直接专门针对Base因为这不会检测到子类。相反,我的第一种方法是使用Boost的enable_if和类型特征://emptybodytotr

c++ - 什么是 C++ 中用于分离 header /源的模板特化的可靠方法

在中等规模甚至大型复杂项目中,分离模板声明和定义很有用以减少编译时间。然而,在复杂的代码中,小的程序员错误可能会导致不被注意的行为改变,例如调用通用版本而不是专用版本。例子:由于错过声明,模板特化变得不可见。/////////////////////fileA.hpp/////////////////////#includetemplateclassA{public:voidfoo(){std::cerrvoidA::foo();/////////////////////fileA-foo-int.cpp/////////////////////#include"A.hpp"templ

C++重载优先于特化?

给定以下代码:#includeusingnamespacestd;templatevoidPrint(Tt){coutvoidPrint(intt){cout>c;return0;}为什么调用Print(2)没有歧义,而是调用voidPrint(inti)?ps:使用bcc64.exe和cl.exe测试。 最佳答案 标准的第13.3.3节,关于为重载选择最佳函数,明确指出如果在具有完全相同参数列表的模板函数和非模板函数之间进行选择,则非模板函数始终是比模板化的更适合。 关于C++重载优先

c++ - "could not convert template argument"指针参数错误,即使使用强制转换

假设我有一个声明如下的模板类:templatestructy{int*b;y(){b=x;}}我确实需要模板参数是一个常量内存地址——它是一个嵌入式代码。如果我尝试像这样实例化它:(编译器是带有-std=gnu++11的gcc4.8.1)yc;我会收到错误消息“无法将模板参数‘1’转换为‘int*’”,这没关系,而且符合标准。我明白。我的问题是转换为指针也不起作用:yd;y(1)>e;error:couldnotconverttemplateargument'1u'to'int*'在这两种情况下。这是为什么?模板参数已经转换,不是吗? 最佳答案

c++ - 重载解析和显式模板参数

以下代码prints"func2".为什么编译器将第二个模板视为更好的匹配,存在显式(未推导出的)模板参数?为什么没有歧义?如果引用C++标准,我将不胜感激。#includetemplatestructidentity{typedefTtype;};templatevoidfunc(T){std::coutvoidfunc(typenameidentity::type){std::cout(1);} 最佳答案 两个候选人都是可行的并且采用相同的参数,因此重载解决过程回退到最后一个决胜局:函数模板的偏序[temp.func.order