草庐IT

C++ 模板 - 错误 : expected initializer before '<' token

我正在尝试学习模板,我希望我的类对能够容纳两个任何类型的对象。我现在只想为obj1提供一个访问器函数。但是当我尝试编译时出现以下错误:error:expectedinitializerbefore'::getObj1()我的代码是:#include#include#includeusingnamespacestd;templateclasspair{public:pair(constT1&t1,constT2&t2):obj1(t1),obj2(t2){};T1getObj1();private:T1obj1;T2obj2;};templateT1pair::getObj1(){ret

c++ - 变量模板参数中的decltype

我正在使用unique_ptr编写一些代码s之类的。该行是:std::unique_ptrresult(...,std::free);哪个有效。我意识到std::free给出的类型是第二个模板参数。我尝试使用:std::unique_ptrresult(...,std::free);这会更容易阅读并且更不容易出错。但是我收到与相关的错误和“用函数类型实例化数据成员”。有没有办法做到这一点? 最佳答案 decltype(std::free)产生std::free的类型,即函数类型void(void*),而不是函数指针类型void(*)

c++ - 当 lambda 作为参数传入时推导模板参数

我正在尝试编写函数func这样编译器就可以推断出模板参数,当我传入std::function时它会起作用,但不适用于lambda:templateTResultfunc(std::functionf){returnTResult();}intmain(){//VisualStudio2013intresult=func([](){//error:'TResultfunc(std::function)':couldnotdeducetemplateargumentfor'std::function'from'main::'return100;});std::functiontestFun

c++ - 标准中是否定义了可变参数模板包扩展的顺序?

我认为扩展parameterpack有以下行为://forArgs...pf(p)...;//wasequivalenttof(p1);f(p2);...;f(pn);但我刚刚发现gcc(4.6、4.7和4.8)是相反的:f(pn);...;f(p2);f(p1);而clang却如我所料。这是GCC中的错误还是它们都符合标准?最小示例#include#includetemplateboolprint(constunsignedindex,constT&value){std::cerrvoidprintAll(Args...args){unsignedi=0;[](...){}(prin

c++ - std::conditional 的可变模板使用,其中一种类型是实例化失败

我正在尝试构建一个可变模板类。通常,实例化的每一级都需要通过切掉一种类型然后使用其余类型来实例化“下一级”。对于我的最终级别,与其专注于一种类型,我宁愿提供一些基本案例类型并避免重复实际逻辑。我添加了一个std::conditional打开BaseCase当其余类型由空参数包组成时。classBaseCase{};templateclassVariadicClass;templateusingNextLevel=typenamestd::conditional,BaseCase>::type;templateclassVariadicClass{Tthis_level;//whatev

c++ - 在 C++ 中使用可变参数模板迭代参数包

作为日志库的一部分,我希望能够迭代参数包,将每个值写入流。然而,我的第一次尝试没有编译。第一个错误是“错误C2144:语法错误:'int'前面应该有'}'”。#include#include#include#includetemplatestd::ostream&Write(std::ostream&o,std::initializer_listlist){size_tsize=list.size();if(list.size()>0){for(size_ti=0;istd::ostream&Write(std::ostream&o,Args...){returnWrite(o,{Ar

c++ - C++ 模板如何专用于所有 32 位 POD 类型?

我开发了一个简单的模板函数来交换单个字段的字节顺序:templateinlinevoidSwapEndian(T&ptr){char*bytes=reinterpret_cast(&ptr);inta=sizeof(T)/2;while(a--){chartmp=bytes[a];intb=sizeof(T)-1-a;bytes[a]=bytes[b];bytes[b]=tmp;}}我经常在T=int或float的地方使用它。这两种类型在目标平台上均由4个字节表示,并且可以由模板的相同特化处理。因为这个函数有时负责处理大缓冲区的原始数据,所以我创建了一个优化的特化:templatein

c++ - 在 C++ 中构建模板函数的调用表

我有一个模板函数,其中模板参数是一个整数。在我的程序中,我需要使用一个在运行时确定的小整数来调用该函数。我可以手工制作一张table,例如:void(*f_table[3])(void)={f,f,f};并调用我的函数f_table[i]();现在,问题是是否有某种自动方法可以按任意顺序构建此表。我能想到的最好办法是使用宏#defineTEMPLATE_TAB(n){n,n,n}这至少避免了一遍又一遍地重复函数名称(我的真实函数的名称比“f”长)。但是,最大允许顺序仍然是硬编码的。理想情况下,表的大小应该只由代码中的一个参数决定。有没有可能使用模板来解决这个问题?

c++ - 如何将算术运算符传递给模板?

我想以某种方式将这些模板合并为一个:templateclassStupidAdd{public:T1_a;T2_b;StupidAdd(T1a,T2b):_a(a),_b(b){}Resultoperator()(){return_a+_b;}};templateclassStupidSub{public:T1_a;T2_b;StupidSub(T1a,T2b):_a(a),_b(b){}Resultoperator()(){return_a-_b;}};(后跟Mul、Div等相同的代码)所有代码都相同,除了实际的“+”、“-”(和“StupidAdd”、“StupidSub”等)。这

C++ 模板化友元类

我正在尝试用C++编写一个2-3-4树的实现。自从我使用模板以来已经有一段时间了,而且我遇到了一些错误。这是我非常基本的代码框架:节点.h:#ifndefTTFNODE_H#defineTTFNODE_HtemplateclassTreeNode{private:TreeNode();TreeNode(Titem);Tdata[3];TreeNode*child[4];friendclassTwoThreeFourTree;intnodeType;};#endif节点.cpp:#include"node.h"usingnamespacestd;template//defaultcons