草庐IT

c++ - 模板实例化失败 : compiler choosing improper overload function

我对模板并不陌生,但我遇到了一个相当奇怪的问题,我需要将模板类型分离到它的组件中,以用于我正在处理的数据序列化程序。这很难解释,所以我已经证明了。这是我简化的示例问题,example.cpp。templatevoidfoo(T&arg){}templatevoidfoo(T&arg){}intmain(intargc,char*argv[]){foo(argc);return0;}我得到一个错误,然后是一个警告,这似乎表明它正在尝试实例化两个函数,但只有其中一个是合适的。$g++-Wall-Wexample.cppexample.cpp:2:43:error:‘T’isnotatemp

c++ - 非模板类中的多个模板函数

我有一个类foo其中包含两个模板函数Add()和Subtract().structfoo{templateU*Add();templateU*Subtract();};使用相同的模板参数是否正确U对于他们两个?我还需要写template每次在模板函数声明之前? 最佳答案 是的,您可以在不同的函数中为模板参数使用相同的名称,就像您可以为参数命名一样。那些在不同功能中的名称是完全不相关的。是的,您必须按照C++语法使用关键字template。 关于c++-非模板类中的多个模板函数,我们在St

c++ - 混合 void_t 和可变参数模板?

考虑以下代码:template>structis_invokable:std::false_type{};templatestructis_invokable>>:std::true_type{};目标是拥有一个特征,该特征能够判断类型为F的可调用对象是否可以使用类型为Args...的参数进行调用。但是,编译失败是因为:error:parameterpack'Args'mustbeattheendofthetemplateparameterlist在C++17中执行此操作的(优雅)方法是什么? 最佳答案 namespacedetai

c++ - 在可变参数模板中实现 STL 函数

我一直在做一个小项目来跟上可变参数模板的速度。我实现了一个小的多维数组。我现在想定义一个对给定位置的最近邻居进行操作的函数——是否有一种优雅的方法来检索数组中给定位置的邻居的值?templatestructMArr{typedefstd::array::type,size>type;std::array,size>data;MArr&operator[](inti){returndata[i];}};templatestructMArr{typedefstd::arraytype;typedata;T&operator[](inti){returndata[i];}};附录:我有点清楚

c++ - 为什么模板别名特化取决于引用它的上下文?

考虑这个示例代码:templateusingpt_type=typenameT::type;templateclassV{usingtype=int;public:usingpt=pt_type;};voidg(){V::pta;//Doescompilept_type>b;//Doesnotcompile}V::pt是pt_type>的别名.然而,它被定义的事实取决于它被引用的上下文。C++标准中哪里解释了模板实参替换模板实参是在引用别名特化的上下文中执行的? 最佳答案 无处可去。这是coreissue1554.Theintera

c++ - 非类型模板参数中的占位符类型是否可以涉及作为模板参数传递的函数的重载解析?

thisquestion的后续行动.假设占位符可用于推断构成非类型模板参数的函数指针的结果类型。c++17是否允许对传递给模板函数的名称执行重载解析——在不知道结果类型的情况下执行隐式转换需要这样做?templatestructFoo{};intbar(int);floatbar(float);intmain(){static_cast(Foo{});}[gcc]以及[clang]似乎接受代码。 最佳答案 是的,根据verybulletRakete1111pointedout是允许的.而且没有必要只是假设它可以完成,它是根据占位符类

c++ - 调用模板函数时的意外输出

下面的代码是我正在经历的cpp测验的一部分:#includetemplatevoidfoo(T){std::coutvoidcall_foo(Tt){foo(S());foo(t);}voidfoo(S){std::cout我不明白为什么输出结果是TS。我希望它是SSCompiler:gccversion4.8.520150623 最佳答案 §14.6¶9states:"Whenlookingforthedeclarationofanameusedinatemplatedefinition,theusuallookuprules(§

c++ - 是否可以在没有显式特化的情况下调用可变参数模板函数?

我正在尝试编写一个函数来为可变参数模板函数转发参数,类似于std::invoke.这是代码:#includetemplatevoidf(Args&&...args){}templateclassF,class...Args>voidinvoke(Ff,Args&&...args){f(std::forward(args)...);}intmain(){invoke(f,1,2,3);std::invoke(f,1,2,3);}但是,我的invoke和std::invoke无法编译。g++提示它无法推断模板参数templateclassF.那么是否可以在没有显式模板特化的情况下调用可变参

模板中的 C++ 数据类型

我对在C++中使用模板的正确/正确方法有疑问。假设我们有一个这样的模板类:templateclassFoo{public:Tadd(Tn1,Tn2);};templateTFoo::add(Tn1,Tn2){return(n1+n2);}这对于基本数据类型非常有效,例如int、double、float、char...等。Foofoo_int;std::coutfoo_double;std::coutfoo_char;std::cout但这对复杂的数据类型不太适用,比如这个:classBar{public:std::stringbar;};Barbar_1;Barbar_2;Foofoo

c++ - 根据模板参数生成不同大小的初始化列表

我有一个包含对象数组T的类,但没有默认构造函数。这是一个例子:#includestructParam{intx;};structA{A(constParam&p){std::coutstructArray{Tdata[n];/*ntimes*/Array(constParam&p):data{/*T(p),...,T(p)*/}{}};intmain(){Paramp{42};Arrayarr(p);return0;}我正在寻找一种方法来初始化data字段,该字段使用大小不一的元素T(p)初始化列表,其中正好包含n元素。感觉可以通过std::make_index_sequence这样的