草庐IT

TEMPLATE

全部标签

c++ - 在成员函数返回类型上参数化的类模板部分特化

以下代码试图根据成员函数指针类型的返回类型对类模板“special”进行特化,导致VC9编译错误:templatestructspecial{};templatestructspecial{};templatestructspecial{};structs{};intmain(){specialinstance;return0;}errorC2752:'special':morethanonepartialspecializationmatchesthetemplateargumentlist同样的代码被GCC-4.3.4接受,如图:http://ideone.com/ekWGg这是V

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

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

c++ - 使用 SFINAE 在 GCC 和 Clang 上给出不同的结果

我正在学习如何利用SFINAE来发挥我的优势。我正在尝试使用它来根据serialize()的存在来选择函数实现在对象中运行。这是我用来确定类型是否定义了serialize()函数的代码:templateclassHasSerialize{private:typedefcharyes[1];typedefcharno[2];templatestaticyes&test(char[sizeof(&C::serialize)]);templatestaticno&test(...);public:staticconstboolvalue=sizeof(test(0))==sizeof(yes

c++ - 模板参数重新声明

这就是我想要实现的。叶子组件会继承Component,其他人将继承ComponenttemplateclassComponent{protected:typedefComponentParentComponentT;...};templateclassComponent:publicComponent{protected:typedefstd::vectorCollectionT;...};但问题是模板参数被重新声明。我不能将第二个移动到第一个之上,因为第二个继承了第一个。error:redeclaredwith2templateparameter(s)note:previousdec

c++ - 为什么 Visual C++ 无法编译继承自私有(private)嵌套类的友元模板?

考虑以下代码:classA{classB{};templatefriendclassC;};templateclassC:A::B{};intmain(){Cc;}它可以用GCC和Clang编译,但是VisualC++2010会报错:test.cc(11):errorC2248:'A::B':cannotaccessprivateclassdeclaredinclass'A'这是VisualC++中的错误还是我遗漏了什么? 最佳答案 1998年标准和2011年标准都包含基本相同的代码作为示例,分别在14.5.3#4和14.5.4#3

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

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

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++ - 关于模板声明中声明的措辞不明确

14/1[temp]提供:Thedeclarationinatemplate-declarationshall(1.1)—declareordefineafunction,aclass,oravariable,or(1.2)—defineamemberfunction,amemberclass,amemberenumeration,orastaticdatamemberofaclasstemplateorofaclassnestedwithinaclasstemplate,or(1.3)—defineamembertemplateofaclassorclasstemplate,or(1

c++ - 结构名称的唯一性

虽然结构的名称在命名空间内的结构集中必须是唯一的,但这样的名称可以与变量和函数“共享”。例如,下面的代码编译得很好://Code1structh{};inth{8};同样,没有碰撞://Code2structh{};voidh(){}1)允许该名称共享的原因是什么?此外,如果我们将模板混入其中,就会出现一些奇怪的情况。代码//Code3templatevoidh(){}structh{};templatestructj{};voidj(){}编译;但是下面的代码失败了://Code4structh{};templatevoidh(){}voidj(){}templatestructj{

c++ - 我可以使用 decltype() 来避免显式模板实例化中的代码重复吗?

我有一个很长的模板函数声明:templatevoidfoo(lotsofargs,goinhere,andevenmore,ofthesearguments,theyjust,dontstop);没有重载。我想显式实例化它。我可以写(比如T=int):templatevoidfoo(lotsofargs,goinhere,andevenmore,ofthesearguments,theyjust,dontstop);但我真的不想复制那么长的声明。我希望喜欢能够说出类似的话:templateusingbar=decltype(foo);然后:templatebar;现在,第一行编译(GC