啊啊templateclassA{public:inta;}b.htemplateclassB:publicA{public:intf();}templateintB::f(){intt;t=this->a;//Okayt=a//Errorreturn0;}为什么不使用this->会出错?我可以使用某种方法省略this->吗?(我修正了一些错误) 最佳答案 模板实例化有两个阶段(“两阶段名称查找”)。在第一阶段,解析(查找)所有非依赖名称。在第二阶段,解析依赖名称。依赖名称是依赖于模板参数的名称,例如:templatevoidfoo
我在一次采访中被问到这个问题。我无法在那里回答这个问题。我现在也无法理解为什么输出是这样的。这是代码:#includeusingnamespacestd;classBase{public:virtualvoidfun(intx=0){coutfun();d1.fun();d1.fun(1.2);return0;}以上代码的输出为:Base::fun(),x=0Derived::fun(),x=10Derived::fun(),x=1.2问题是:在第一种情况下,我们说fun()函数都被重载了(并且没有被覆盖,因为它们的声明不同)并且调用了基础fun(),但是fun()的这些声明不可能被重
我有一个基类,它有两个同名但在2级继承中具有不同签名的函数。structA{virtualvoidf(int){}virtualvoidf(int,int){};virtualvoidf1(int){}};structB:publicA{};structC:publicB{voidf(int,int){}voidf1(int){}};intmain(){Cobj;obj.f1(0);obj.f(0,0);obj.f(0);//(1)cannotbefoundobj.B::f(0);//(2)works}我希望我的编译器(gcc-4.3.2)在(1)找到正确的定义,但我得到了g++mai
我很困惑为什么C++编译器不接受这个:classFoo{private:voidBaz(){}};classBar{public:voidBaz(){};classFooBar:publicFoo,publicBar{};voidmain(){FooBarfb;fb.Baz();}gcc给出的错误是:requestformember‘Baz’isambiguouscandidatesare:voidBar::Baz()voidFoo::Baz()但是我想要Bar::Baz()不是很明显吗,因为Foo::Baz()是私有(private)的?为什么编译器不会在这里消除歧义?
例子:classC{public:voidoperator=(inti){}};classSubC:publicC{};下面给出编译错误:SubCsubC;subC=0;“'subC=0'中的'operator='不匹配”一些消息来源说这是因为赋值运算符不是继承的。但这不只是因为SubC的默认构造复制赋值掩盖了它们吗? 最佳答案 复制赋值运算符是在派生类中自动生成的。由于C++的常规名称隐藏规则,这会导致基类的赋值运算符被隐藏。您可以通过“using”指令取消隐藏基类中的名称。例如:classC{public:voidoperato
首先,我了解C++标准(ISO/IEC14882:2003):第11.5节第1段,但事实并非如此(但编译器显然不这么认为)。我尝试通过this指针在派生类方法中调用protected基类方法,静态转换为基类指针并在MSVC2008错误C2248:'A::f'中:无法访问类“A”中声明的protected成员。我必须在“奇怪的重复模板模式”的上下文中执行此操作,但我可以用更简单的代码重现此错误,如下所示:classB{protected:voidf(){}};classD:publicB{public:voidg(){f();//okthis->f();//okstatic_cast(t
我想将一些基本信息注入(inject)到它可以构建的派生类中。派生类不应该关心初始化这些信息,它应该就在那里。仅此一项就可以通过继承轻松实现。但问题是基类自己并不知道这些值。相反,它们需要作为参数传入。但是,由于派生类不需要处理这个问题,因此通过派生构造函数隧道传输参数并调用基类构造函数是不可行的。我能想到的唯一解决方案是使信息静态可用,以便基类可以在没有帮助的情况下获取它们。但我想避免这种情况。是否有某种方法可以先创建和初始化基类,然后再将实例扩展为派生类型?如果不是,我如何使用C++的可用功能实现这种创建顺序和依赖关系?#include#includeusingnamespaces
在过去一两年使用C#之后,我的C++有点生疏了。如果我有以下内容:classCBase{public:CBase(LPCTSTRpszArg1,LPCTSTRpszArg2,LPCTSTRpszArg3);virtual~CBase();//Etc...};classCDerived:CBase{//Etc...};看来我无法创建CDerived的实例。noinstanceofconstructor"CDerived::CDerived"matchestheargumentlist我知道我可以显式创建派生构造函数:CDerived::CDerived(LPCTSTRpszArg1,LP
这个问题在这里已经有了答案:WhyBaseClasscatchblockcatchderivedclassobject?(3个答案)Whythrowatderivedclasscatchesbybase?(5个答案)关闭5年前。如果我正在传递派生类的对象,那么应该调用派生类的catchblock。但是输出显示异常被基类捕获。为什么?#includeusingnamespacestd;classBase{};classDerived:publicBase{};intmain(){Derivedd;//someotherstufftry{//Somemonitoredcodethrowd;
我在库中有这段代码:classParent{//somedataandfunctions};voidmyfunc(Parent&ref);我想在我的应用程序中执行此代码:classChild:publicParent{//someotherdataandfunctionsvoiddostuff(){myfunc(*this);}};通过*this是否安全?(没有切片,没有复制,......)像这样调用myfunc更好吗:myfunc(*((Parent*)this))请注意,我无法控制myfunc内部发生的事情,在某些情况下,我什至不知道里面发生了什么。我多次使用过指针传递,我已经习惯