草庐IT

c++ - 模板变量

我目前有以下非模板代码:classVector{public:doubledata[3];};staticVector*myVariable;voidfunc(){myVariable->data[0]=0.;}intmain(){myVariable=newVector();func();}然后我想模板化维度:templateclassVector{public:doubledata[DIM];};staticVector*myVariable;voidfunc(){myVariable->data[0]=0.;}intmain(){myVariable=newVector();fu

c++ - g++ 选项显示哪些类是从模板创建的

是否有一些g++选项显示哪些类是从模板创建的?例如原始源代码中有模板定义:templatestructSomeStruct{Tvariable;};SomeStructinstance;我希望看到SomeStruct的实现。 最佳答案 您可以使用-fdump-class-hierarchy标志获取该信息。它会列出比您要求的更多的内容,但如果搜索以Class开头的行,您会找到您要查找的内容。编辑:这是包含iostream的程序的一些输出。可以看到有char和wchar_t的实例化:Classstd::basic_ostream>Cla

c++ - 模板区域中的不可推导上下文

templatestructWrap{Wrap(T*p){}};#ifdefTEMPLATEtemplatevoidfoo(Wrapt){}//version-1#elsevoidfoo(Wrapp){}//version-2#endifintmain(){foo(newint);}编译#else部分时,编译正常并选择了version-2。如果我尝试编译#ifdef部分,我希望应该选择版本1。但是编译器给出错误,error:nomatchingfunctionforcallto`foo(int*)'我是否触及了templatefoo的不可推导部分?如果是,那么谁能阐明不可推导区域的确切

c++ - 通过宏安全地传递模板参数逗号?

我目前正在使用宏来更简洁地声明相对较长的部分专用模板类列表。以下是一些过于简化的示例:#defineINSTANTIATE_MYTYPE(freeargs,specialization,myvalue)\template\structMyType{staticconstboolvalue=myvalue;}如果我在每种情况下都没有要传递的逗号,这就可以正常工作:INSTANTIATE_MYTYPE(typenameT,std::vector,true);如果我有逗号通过单级宏扩展,它有一个可以容忍的解决方法:#defineMacroComma,INSTANTIATE_MYTYPE(ty

c++ - 将可变参数模板链接在一起

如果将以下代码中的X转换为使用C++11可变参数模板,并且应该支持任意数量的模板参数,它会是什么样子?templatestructA{enumO{offset=OFFSET};enumS{size=2};};templatestructB{enumO{offset=OFFSET};enumS{size=4};};templatestructC{enumO{offset=OFFSET};enumS{size=10};};templateclassB0,templateclassB1,templateclassB2>structX:publicB0,B1::size*B0::offset>

c++ - 我可以检查哪些函数模板至少实例化过一次吗?

我有很多模板代码。由于错误的模板代码除非经过编译,否则不会引发编译器错误,有什么方法可以检查编译器实际“编译”了哪些模板函数,哪些被完全忽略了?编辑2:如果一个特定的类模板或函数模板被实例化一次,对于任何参数类型,那是可以的。我想要从未以任何形式实例化的函数/类模板列表。一个具体的例子如下。它们是两个不同的模板函数,我想知道其中一个或两个是否从未被实例化。templatevoidadvance(T_InputItr&aItr,T_DistanceaN,bidirectional_iterator_tag)templatevoidadvance(T_InputItr&aItr,T_Dis

c++ - 模板中有两个默认参数,这里有什么问题?

下面的代码显示了2个Foo模板,每个模板都有2个默认参数,Foo1有一个单独的原型(prototype)而Foo2没有,它们在其他方面是一样的。为什么第一次调用Foo1会导致编译器(VS2010NativeC++)产生错误,而其他3个调用正常?#include//notneededbuttopreventanswersinthisdirection...#undefmax#undefmintemplatevoidFoo1(Tv1=std::numeric_limits::min(),Tv2=std::numeric_limits::max());templateinlinevoidFo

c++ - 在C++中使用模板成员函数继承模板类

问题:我收到以下代码的以下错误,有人知道为什么吗?问题:我正在研究一个类(ClassB),它控制来自外部库(libMesh)的多个类的行为。“...做某事...部分代码旨在在这些具有模板函数的外部库类中设置一些变量。我希望能够从继承类(ClassC)的构造函数中设置其中一些值。但是,如果我这样做,就像下面的代码一样,我会得到显示的错误。如果我在构造函数中删除此命令,它就可以正常工作。我还提供了一个更详细的示例,该示例会产生相同的错误,但使用了libmesh类本身,它说明了我想做得更好一点。我不确定我正在尝试做的事情是否有用,我主要想知道为什么这不起作用,因为它似乎应该起作用。我找到了另

c++ - 在函数模板中创建容器迭代器

代码是使用GCC编译的。这在VC++中没有任何错误templatevoidFunction(T&A){T::iteratorit;//Error:dependent-name'T::iterator'isparsedasanon-type,//butinstatiationyieldsatype.}Thisarticle声明编译器无法确定T中的迭代器是否存在类型是一个类或只是一个静态成员。所以我们必须使用typename将符号分类为类型的关键字。我的问题是,因为T在编译时已知,那么编译器已经知道iteratorT里面是一个类(在我的例子中T是vector)。那么为什么会出现错误呢?这也

c++ - 尝试构建任意深度树状结构的可变模板实例化中的无限递归

我正在对可变参数进行一些实验,我无意中遇到了一个我无法找到解决方案的问题-基本上我正在尝试构建一个包含任意数据类型组件的树-这里是一些代码:templatestructSeqExpression{constA&first;constB&then;};templateSeqExpressionmake_seq(constA&a,constB&b){return{a,b};}templateautomake_seq(constA&first,constB&second,T...rest)->decltype(make_seq(make_seq(first,second),rest...))