草庐IT

c++ - 为什么*everything* 在 ATL/WTL 中使用模板基类?

我很难理解ATL/WTL代码中模板的用途。当你查看WTL时,你会看到如下代码:templateclassCEditT:publicTBase{...};typedefCEditTCEdit;为什么是CEditT用模板基类定义?换句话说,在什么情况下会CEditT曾经在哪里实例化T是不是CWindow? 最佳答案 这样您就可以覆盖ATL::CWindow中由ATL/WTL类调用的方法。如果ATL::CWindow中有您不喜欢的内容,您可以使用覆盖的方法从ATL::CWindow派生一个类,然后传递您的新类作为TBase。例如,ATL:

c++ - Variadic 模板和 "expected a type"错误

我正在(主要是出于学习目的)自己实现tuple,我刚刚遇到了一个问题。我有以下代码:namespaceRose{templatestructRemoveReference{typedefTType;};templatestructRemoveReference{typedefTType;};templateclassTuple;templateclassTuple{public:Tuple(Firsta,Elems...more):More(more...),Element(a){}Tuple&operator=(constTuple::Type,RemoveReference::Ty

c++ - 虚函数和模板冲突

我有一个pointAccumulator的抽象基类。这个抽象基础将用方法填充,例如返回所有点的平均值的函数。这两个类的示例如下所示:classlala{public:virtualsomeFunctions=0;virtualboolisEmpty()=0;};classlalaLower:publiclala{public:lalaLower(){}~lalaLower(){}someFunctionstemplatevoidserialize(Archive&ar,constunsignedintversion){ar&heights_;}protected:std::dequeh

继承类的 C++ 模板构造函数

据我所知,C++中的继承是每当调用子类的构造函数时,都会自动调用父类的构造函数。对于模板化构造函数,模板参数的数据类型是自动推断的,即我们不需要单独指定模板参数。该程序生成了一个我似乎不明白的编译错误。#include#include#includeusingnamespacestd;classA{public:intx;inty;intfirst(){returnx;}intsecond(){returny;}};classC{public:floata,b;C(){a=0.0f;b=0.0f;}templateC(Tt){a=t.first();b=t.second();}};cl

c++ - 在模板中指定允许的参数

我能否准确指定模板可以接收的参数类型?例如,我想创建一个模板,它只能用A类或扩展类A的类实例化。在Java中,泛型通过以下方式支持这一点:classB{}可以用C++中的模板实现类似的东西吗?templateclassB{} 最佳答案 有两种方法可以做到这一点。首先,通过使用std::enable_if的隐藏虚拟模板参数用std::is_base_of::value作为条件。如果后一个表达式计算为false,然后是嵌套的type在std::enable_if中不存在.如果您在重载函数上使用它,SFINAE则意味着“替换失败不是错误”

c++ - 为什么 std::basic_string 不支持通过表达式模板进行连接?

Qt的QString可以通过operator%连接起来,它使用表达式模板预先计算结果字符串的大小并优化对operator+的多个链式调用.参见thisquestionofmine了解更多信息。为什么std::basic_string没有采用类似的结构?C++11甚至允许这样做吗?我只看到优点,很明显,库实现者可以在需要时破坏ABI兼容性(C++11甚至为libstdc++提供了一个很好的理由)。 最佳答案 因为没有人提出标准;除非有人提出建议,否则它不会进入。还因为它可能会破坏现有代码(如果他们使用operator+就是这样)。此外

c++模板函数参数推导和函数解析

今天我只是想提出一个关于C++11(我使用的是vs2010sp1)中的C++模板函数参数推导和模板函数重载解析的问题。我定义了两个模板函数如下:函数#1:templatevoidfunc(constT&arg){cout函数#2:templatevoidfunc(T&&arg){cout现在考虑以下代码:intmain(){//Iunderstandthesefirsttwoexamples://function#2isselected,withTdeducedasint&//IfIcommentoutfunction#2,function#1isselectedwith//Tdedu

c++ - 通过模板化引用传递 C++11 lambda

在gcc4.5中,使用-std=c++0x,以下代码可以按预期编译和工作,#includetemplatevoidcaller(Hh){h();}intmain(){autoc=[](){printf("A\n");};caller(c);caller([](){printf("B\n");});return0;}打印,AB但是,如果caller被定义为引用,templatevoidcaller(H&h){h();}编译器提示,test.cpp:Infunction‘intmain()’:test.cpp:61:34:error:nomatchingfunctionforcallto‘

c++ - 推导非类型模板参数 Unsigned Int/size_t

我正在尝试推断一个非类型模板参数。#includetemplatevoidgetsize(unsignedints){std::cout(4);//orevengetsize();//Isthispossible?}但是我得到了错误:deduce_szie_t.cpp:Infunction'intmain()':deduce_szie_t.cpp:9:15:error:nomatchingfunctionforcallto'getsize(unsignedint)'deduce_szie_t.cpp:9:15:note:candidateis:deduce_szie_t.cpp:4:6

c++ - 模板定义找不到我的函数

我正在尝试将一些为MSVC编写的代码移植到Clang上进行编译。但是,查找某些模板函数似乎有问题。这是给我带来问题的结构定义的一部分:templatestructFixedVector{T*ptr;size_tcount;typedefTvalue_type;FixedVector():ptr(0),count(0){}~FixedVector(){DeleteArr(ptr);//Errormessageappearsherecount=0;}//...}DeleteArr(ptr)函数引用了后面定义的函数,如下所示:templateinlinevoidDeleteArr(T*&pt