草庐IT

c++ - 在 C++ 中嵌套在模板中的类中使用基类的成员时出错

考虑以下示例:templatestructA{structB{intb;};structC:B{voidf(){b=0;}};};用GCC4.8.1编译它会出现以下错误:test.cc:Inmemberfunction‘voidA::C::f()’:test.cc:9:11:error:‘b’wasnotdeclaredinthisscopeb=0;^但是,b是父类B的成员(我在示例中使用了struct来公开所有内容)并且如果我使A非模板一切编译。为什么编译器会报错,我该如何避免? 最佳答案 这在语言中是一种晦涩的极端情况,但解决方

c++ - 派生类不能使用指向 protected 基类成员的成员指针

includeclassBase{protected:intfoo;intget_foo(){returnfoo;}};classDerived:publicBase{public:voidbar(){intBase::*i=&Base::foo;this->*i=7;printf("foois%d\n",get_foo());}};intmain(){Derivedd;d.bar();}我不明白为什么我的派生类型不能指向基类的protected成员。它有权访问该成员。它可以调用类似作用域的函数。为什么它不能创建一个成员指针?我正在使用gcc4.1.2,但出现此错误:test.cc:I

C++ 在基类中使用静态数组,在派生类中声明

我正在尝试创建一些类,它们都是从抽象类(我们称之为)BaseClass派生的类。在BaseClass中,我想对派生类中声明的static变量(数组)进行操作。C++中是否有一种聪明的方法让编译器知道静态变量将在派生类中声明?或者,例如,我应该在派生类的构造函数中将对静态变量的引用传递给基类构造吗?这是我的想法:classBaseClass{std::vector&vector;public:BaseClass(std::vector&dVector):vector(dVector){};voidvectorOperation(){vector.doSomething();}...}cl

c++ - 使用基类对象 C++ 初始化子类?

所以,标题可能有点困惑,但这是我的问题:我有一个父类(superclass)(我们称它为SupClass)和一个继承自SupClass的子类(我们称它为InhClass)。现在,我想为我的InhClass创建一个构造函数,它接收一个SupClass对象并用它初始化InhClass的“SupClass部分”。下面是一个代码示例,试图说明这一点:ClassSupClass{public:SupClass(){//InitializeSupClassobject}};ClassInhClass:privateSupClass{public:InhClass(SupClassobj){//In

基类和继承类之间的C++函数重载

考虑下面的例子。我猜想因为func是虚拟的,所以调用哪个实现的决定将在运行时根据实例类型(类型B)和参数类型(short或int)完成然而,在运行这段代码后,我得到了意想不到的结果,指针类型只决定了跳转哪个函数,这完全打破了我对多态性的基本假设...这引出了一个问题,我在哪里可以将2func实现与函数重载联系起来?谁能告诉我是什么原因导致了这个结果?谢谢classA{public:virtualvoidfunc(shortx){printf("A::func%d\n",x);}};classB:publicA{public:virtualvoidfunc(intx){printf("B

c++ - 是否可以通过删除基类中的复制构造函数/运算符来使派生类不可复制?

PreC++11,我问这是否可以使用私有(private)/未实现的技巧(参见here)。显然,这是不可能的。我想知道新的=delete语法是否改变了事态,因为强制派生类不可复制仍然是一个有用的特性。更新后的代码片段可能看起来像这样:classBase{public:Base(){}virtual~Base(){}Base(constBase&)=delete;Base&operator=(constBase&)=delete;virtualvoidinterfaceFunction()=0;//etc.//nodatamembers};classData{/*...*/};class

c++ - 基类重载方法,默认成员变量

我有一个类结构如下:classBase{public:voidsetDefault(uint8_tmy_default){m_default=my_default;}voidmethod(uint8_t*subject){method(subject,m_default);}virtualvoidmethod(uint8_t*subject,uint8_tparameter)=0;protected:uint8_tm_default;};classDerived1:publicBase{public:voidmethod(uint8_t*subject,uint8_tparameter

c++ - 如何从基类 vector 到达派生类变量?

#include#includeclassEntity{public:boolhinders_sight=false;};classPillar:publicEntity{public:boolhinders_sight=true;};intmain(){std::vectorEntities;Pillarpillar;Entities.push_back(&pillar);std::couthinders_sightpillar.hinders_sight返回true(它应该如此)但是Entities[0]->hinders_sight返回false。如何从vector到达pilla

c++ - 类模板特化从不同的基类继承是否合法?

我遇到过这样一种情况,我的类模板部分特化共享大量代码,将它们移到基类中是有意义的。然而,所有的特化都具有相同基类是没有意义的。以下示例代码在GCC7.1中编译无误:structfoo_base_1{voidbar(){std::coutstructfoo{};templatestructfoo:foo_base_1{};templatestructfoo:foo_base_2{};intmain(){foox;fooy;x.bar();y.bar();}我意识到尽管它们是同一类的特化,但它们实际上是不同的类型。仍然,感觉同一个类可以从不同的基础继承是错误的。我想要的是一些保证,这没关系

c++ - 为什么我的派生类找不到我的基类的类型别名?

让我们从代码示例开始,因为应该很容易看出发生了什么:templatestructBase{usingType=int;};templatestructDerived:publicBase{//error:unknowntypename'Type'usingNewType=Type;};intmain(){}我原以为Derived会找到Base的Type别名。但是,我尝试过的所有编译器(MSVC、Clang、GCC)似乎都不喜欢这段代码。更令人惊讶的是,将Derived的继承更改为:structDerived:publicBase解决问题。有什么我可以更改以允许Derived找到Base