草庐IT

c++ - 具有依赖类型的简单 CRTP 案例的编译错误

我正在尝试使用一种简单形式的CRTP(奇怪的重复模板模式),因为我有几个类,每个类都有几个相关的类,我想要一种将它们绑定(bind)在一起的方法(例如,我有类像Widget、Doobry和Whatsit,以及相关类WidgetHandle、DoobryHandle和WhatsitHandle)。我用来从Base继承的每个类都添加了一个value_typetypedef,这样基类就可以将它称为typenameTWrapper::value_type。structWidgetHandle{};templateclassBase{public:Base(typenameTWrapper::v

c++ - CRTP 复制方法警告潜在的内存泄漏

我有一个对象层次结构,需要能够从基类克隆对象。我遵循了典型的CRTP模式,除了我还希望能够在直接对子类调用copy时返回子类。为此,我遵循了此处的建议:https://stackoverflow.com/a/30252692/1180785它似乎工作正常,但Clang警告我有潜在的内存泄漏。我已将代码缩减为这个MCVE:templateclassCRTP{protected:virtualCRTP*internal_copy(void)const{returnnewT(static_cast(*this));}public:T*copy(void)const{returnstatic_

CRTP 的 C++ 编译器错误

我有以下类层次结构:templateclassbase{public:voidf(){}};classclass_a:publicbase{};classclass_b:publicbase,publicclass_a{usingbase::f;};intmain(){class_bb;b.f();return0;}Comeu和IntelC++v11声称一切都很好,但是GCC(4.4.1)和VC++2008似乎提示(http://codepad.org/KQPDsqSp),例如:g++-pedantic-Wall-otesttest.cpptest.cpp:Infunction‘int

c++ - crtp 和类型可见性

我有一个我正在尝试解决的难题,从根本上可以归结为以下示例:templatestructA{typedeftypenameCT::VALUE_TFOO;//FOOisdependentonCT};templatestructB{typedeftypenameCT::BARBAR;BARfoo(){}};templatestructC:B>{typedefDTVALUE_T;typedeftypenameA::FOOBAR;};intmain(){Cc;}我可以尝试解释上面的内容(我试了大概三遍,把文字删掉了!),但基本上要求是:C必须继承自B用C输入(利用CRTP),即B>C是唯一可以实

c++ - CRTP和动态多态编译报错

classA{virtualA*foo()=0;};templateclassB:publicA{virtualT*foo(){returnnullptr;}};classC:publicB{};这是Possibilitytomixcompositepatternandcuriouslyrecurringtemplatepattern的简化实现.我收到以下错误:Returntypeofvirtualfunction'foo'isnotcovariantwiththereturntypeofthefunctionitoverrides('C*'isnotderivedfrom'A*')在

c++ - 来自私有(private) CRTP 基地的回调

以下代码不起作用,因为您不能从私有(private)基类static_cast。用C风格的转换来替换转换是可行的(尽管我最初认为这会调用未定义的行为,但显然它不会,请参阅thisanswer),但是相当丑陋,因为它还允许您绕过常量检查等.另一种方法是使CRTPBase成为友元,但这会暴露所有Derived的私有(private)成员。是否有另一种不使用C风格转换也不使CRTPBase成为友元的编写方式?templatestructCRTPBase{voidcallBase(){T*derived=static_cast(this);derived->publicMethod();}};

c++ - 在使用 Clang 编译 CRTP Singleton 时,如何解决声称缺少 "explicit instantiation declaration"的问题?

我们正在使用curiouslyrecurringtemplatepattern实现单例。但是,在最近的Clang版本中,我们收到了-Wundefined-var-template警告。建议的修复方法是添加“显式实例化声明”。我试图这样做,但后来在定义单例模板类成员变量的编译单元中出现有关“实例化后的显式特化”的错误。解决此警告突出显示的问题的适当构造是什么?简化详细信息(已删除大部分逻辑,以制作MCVE):单例基础.hh:templateclassSingletonBase{public:staticT*get_instance(){if(!instance_){instance_=T

c++ - 在 CRTP 中使用内部类

有没有可能在CRTP中使用内部类或枚举?例如。templatestructContainerBase{std::map_;};structConcreteContainer:ContainerBase{enumclassEnum{left,right};}; 最佳答案 没有。在类模板中,派生类尚未完全定义(在standardese中这不是一个完整的对象)。Infact(工作草案):Aclassisconsideredacompletely-definedobjecttype(orcompletetype)attheclosing}因

c++ - 使用 clang++ 和 g++ 的 SFINAE 和 CRTP 的一些魔法

代码下面的代码给出了不同的输出,带有和不带有*注释的行:#include#includetemplateusingbool_void_t=void;templatestructis_complete:std::false_type{};templatestructis_complete>:std::true_type{};templatestructBase{staticconstexprboolvalue=is_complete{};//usingmagic=bool_void_t;//*};structFoo:Base{};intmain(){std::cout输出Thelinem

c++ - 在 CRTP 基类的后期指定返回中使用 decltype

我正在尝试在CRTP基类中的成员函数的后期指定返回中使用decltype,它出现错误:invaliduseofincompletetypeconststructAnyOp>.templatestructOperation{templateautooperator()(constFoo&foo)const->typenamestd::enable_if::value,decltype(static_cast(nullptr)->call_with_foo(foo))>::type{returnstatic_cast(this)->call_with_foo(foo);}};templat