草庐IT

c++ - 未在部分特化中使用的模板参数

我有以下代码:template>classCarray{//...typedefT*pointer;typedefpointeriterator;//...};现在我正在尝试对iterator_traits进行部分特化。对我来说似乎没问题,但g++4.4.5提示:#includenamespacestd{templatestructiterator_traits::iterator>{//line128typedefTvalue_type;typedeftypenameAllocator::difference_typedifference_type;typedeftypenameAl

c++ - 奇怪的 C++ 模板方法特化问题

我在方法特化方面遇到了一个奇怪的问题。鉴于此代码...#includeclassX{public:templatevoidset(Tv);};templatevoidX::set(conststd::string&v){}templatevoidX::set(intv){}intmain(int,char*[]){Xx;std::stringy;x.set(y);x.set(1);}当我将它与g++4.3.3链接时,我得到了一个undefinedreferencevoidX::set,std::allocator>>(std::basic_string,std::allocator>)

c++ - 如果模板包含虚函数是否安全?

模板的早期绑定(bind)和虚函数的后期绑定(bind)。因此,模板包含虚函数是否安全?templateclassbase{public:Tdata;virtualvoidfn(Tt){}}; 最佳答案 绝对安全。一旦实例化了类模板,它就会像其他类一样成为普通类。templateclassbase{public:Tdata;virtualvoidfn(Tt){}};classderived:base{public:virtualvoidfn(intt){}//override};base*pBase=newderived();pBa

指向类成员的模板函数的C++指针

我在“C”类中有以下函数classC{templatevoidFunc1(intx);templatevoidFunc2(intx);};templatevoidC::Func1(intx){Ta(x);}templatevoidC::Func2(intx){Ta(x);}函数仅在实现中使用模板。签名不包含模板参数。是否可以定义指向此类模板函数的指针?我尝试了以下定义,但它导致编译错误。typedeftemplatevoid(СSomeClass::*TFuncPtr)(int); 最佳答案 一旦实例化,成员函数模板就是一个普通的成

c++ - 模板代码无法编译(延迟查找)

我有两个奇怪的情况,看起来代码应该编译,但实际上没有。首先,考虑下面的代码,它编译成功:structA{templatevoidmember_func(Tt){global_func(t);}};intmain(){}但如果我通过前缀“::”完全限定global_func,它不会编译并出现错误“'global_func'未在此范围内声明”:structA{templatevoidmember_func(Tt){::global_func(t);}};intmain(){}此外,如果我尝试将global_func传递给boost::bind,它不会编译(同样的错误):#includecl

c++ - 我应该更喜欢 mixin 还是函数模板来为一组不相关的类型添加行为?

Mixins和函数模板是为多种类型提供行为的两种不同方式,只要这些类型满足某些要求即可。例如,假设我想写一些代码,允许我将一个对象保存到一个文件中,只要这个对象提供一个toString成员函数(这是一个相当愚蠢的例子,但请耐心等待)。第一个解决方案是编写如下函数模板:templatevoidtoFile(Tconst&obj,std::stringconst&filename){std::ofstreamfile(filename);file另一种解决方案是使用混入,使用CRTP:templatestructToFile{voidtoFile(std::stringconst&file

c++ - 这个 has_member 类模板是如何工作的?

我试图了解以下类模板的工作原理(取自here),但我无法正确理解它:templateclasshas_member{classyes{charm;};classno{yesm[2];};structBaseMixin{voidoperator()(){}};structBase:publicType,publicBaseMixin{};templateclassHelper{};templatestaticnodeduce(U*,Helper*=0);staticyesdeduce(...);public:staticconstboolresult=sizeof(yes)==sizeo

c++ - 将函数模板传递给其他函数

假设我有一个函数可以对任意容器类型(C++11)执行某些操作:templatevoidbar(containerType&vec){for(autoi:vec){std::cout我可以像这样从另一个函数调用这个函数:voidfoo(){std::vectorvec={1,2,3};bar(vec);}现在假设我有不同的功能,就像bar,我想将这些功能之一传递给foo,那么foo看起来像这样:templatevoidfoo(funcTypefunc){std::vectorvec={1,2,3};func(vec);}但是,像这样调用foo:foo(bar);不起作用(很清楚,因为ba

c++ - g++ 可变参数模板。简单示例代码无法编译,提示 'Not a template'

我正在探索这个陌生的领域,并想尝试来自DannyKalev'stutorialonthematter的一个简单示例.代码非常简单:templatestructCount{staticconstintvalue=0;};templatestructCount//partialspecialization{staticconstintvalue=1+Count::value;};但是gcc4.4.7甚至4.7.0提示(尽管-std=c++0x-std=gnu++0x标志):/src/tests/VTemplates.h:12:8:error:'Count'isnotatemplate/sr

c++ - 如何获得与函数一起使用的模板模板参数推导?

考虑一组函数,例如templatevoidA(constFun&){}templatevoidB(constFun&){}templatevoidC(constFun&){}旨在将函数类型作为参数。然后,这完全没问题:templatevoidFunc(constT&){}A(Func);B(Func);C(Func);现在我想摆脱重复inttemaplate参数,所以我尝试了这个:templatestructHelper{templateclassFun>staticvoidA(Fun&f){A(f);}templateclassFun>staticvoidB(Fun&f){B(f);