草庐IT

c++ - 将 lambda 传递给 void 指定模板失败

我尽可能地简化了问题,所以这里是有问题的函数:classTest{public:templatevoidExecuteFunction(std::functionf){}};如果我用int类型调用函数,一切正常,但是,如果我用void类型的lambda调用它,它就不再编译了。Testtest;test.ExecuteFunction(//doesn'tcompile[](void)->void{inti=5;});test.ExecuteFunction(//thiscompiles[](int)->void{inti=5;});编译器错误:ErrorC2672'Test::Execu

c++ - 使用可变参数包实例化函数模板

假设我有这段代码:templatestructMatrix{};templateautocompute(Matrix,Matrix){return0;}Matrixa;Matrixb;Matrixc;Matrixd;intmain(){compute(a,b);compute(c,d);autofp=&compute;fp(a,b);fp(c,d);}这两个compute()调用会只实例化一个函数模板,即compute还是会根据参数有两个不同的实例化?我想通过获取指向特定实例化的函数指针来确认这一点,看看我是否可以使用相同的函数指针使用2组不同的参数调用该函数,但是我在调​​用fp的那

具有相同签名的 C++ 模板类运算符重载

一个简单的C++OO问题重新分级模板和运算符重载:在下面的类中,我重载了索引运算符两次:templateclasstest{Aa1;Ba2;public:A&operator[](constB&);B&operator[](constA&);};现在,如果我用相同的类型名实例化这个模板类的一个对象:testobj;调用索引运算符将导致错误,因为两个重载函数将具有相同的签名。有什么办法可以解决这个问题吗?抱歉,如果这是一个基本问题。我还在学习! 最佳答案 您可以添加部分特化:templateclasstest{Aa1,a2;publi

c++ - 使用模板的继承和转换未按预期工作

我一直在研究模板和继承,但是在对基类执行强制转换时使用带有模板参数的虚函数成员有些奇怪。他们似乎使用“直接继承”工作,但如果我稍后“推迟”继承则不行。一些代码来说明:例子[1]structCastExBase{virtualvoidf(){}};templatestructCastExA:CastExBase{voidf(){std::cout,protectedCastExB{voidf()override{(static_cast(this))->execF();}voidg()override{(static_cast(this))->g();}};测试用例:CastExBase

c++ - 在模板类中定义的友元函数

在模板类A中定义了一个名为test()的友元函数:templateclassA{public:friendvoidcs(){/*code*/}}另一个类继承自模板类A:classB:publicA{}在main函数中,我调用cs()失败,如果我不在全局范围内提供函数声明,编译器将看不到它的声明:intmain(){cs()}但是当cs将其模板类T作为参数时,情况就不同了:templateclassA{public:friendvoidcs(constT&t){}}现在可以在主函数中成功调用cs()而无需任何decalration:intmain(){Bb;cs(b);}如果函数将用户定

c++ - 根据参数的默认值启用模板参数类型的自动推导

这是我想做的:#includetemplatevoidf(ContainerTypec1,ComparatorTypecomp=[](consttypenameContainerType::value_type&l,consttypenameContainerType::value_type&r){returnla{1,2};f(a);return0;}但它不起作用:无法推断“ComparatorType”的模板参数。使用代理函数代替实际的默认参数值是可行的,但似乎过于冗长,难道没有更好的方法吗?更不用说它不一样了,因为现在我不能在不更改客户端代码中的函数名称的情况下用我自己的默认比较

C++模板模板推断类型参数

我有一个基本类型templatestructBase{};以及基于许多版本的Base构建的更复杂的东西(有些是int模板,有些是类模板):templatetypenamebasetype,typenamep,typenameq>structComplex{};然后,我创建这样的变量:Complex,Base>c;有没有办法推断我的第一个模板参数是Base,或者p和q是basetype的特殊版本所以我可以写Complex,Base>c;我想没有。但模板有时会隐藏一些魔力。 最佳答案 如果你想要Complex总是让它的两个参数是同一个模

c++ - 我应该为 Visual C++ 游戏开发项目使用哪个项目模板?

对于VisualC++游戏开发项目,我应该使用哪个项目模板?我是VisualStudio的新手,我对所有这些Windows窗体应用程序、Win32控制台应用程序、CLR控制台应用程序等东西有点困惑。我以前在Linux中编写游戏代码,现在我想做一个纯Windows应用程序。 最佳答案 您可以只在VisualC++项目下打开一个空项目。我不知道您将使用什么库等。我怀疑您是否走.NET路线,在这种情况下肯定不想要基于CLR的应用程序。 关于c++-我应该为VisualC++游戏开发项目使用哪个

c++ - 哪个版本的 GNU GCC 支持 TR1 外部模板?

最早是什么GNUGCC(g++)版本支持TR1externtemplates?比如4.0版本已经支持了吗? 最佳答案 您可以找到支持的C++-0x功能列表以及支持它们的G++版本here.列中有一个简单的是,所以我假设它们是4.3或可能更早的版本。 关于c++-哪个版本的GNUGCC支持TR1外部模板?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/629865/

c++ - 使用抽象类作为模板类型

我对C++还是很陌生(从Java过来的)。我有一个Actor类型的STL列表。当Actor只包含“真正的”方法时,就没有问题了。我现在想将这个类扩展到几个类,并且需要将一些方法更改为抽象的,因为它们不再像具体的那样有意义。正如我预期的那样(根据文档),这是个坏消息,因为您无法再实例化Actor,因此当我遍历我的列表时,我遇到了问题。C++的方法是什么?如有不明之处请见谅 最佳答案 你不能直接处理这个:正如您所见,当类是抽象类时,您无法实例化对象。由于切片问题,即使类不是抽象的,您也无法将派生对象放入列表中。解决方案是使用指针。所以第