派生类模板看不到基类的成员[重复]
Posted
技术标签:
【中文标题】派生类模板看不到基类的成员[重复]【英文标题】:Derived class template doesn't see the base class's member [duplicate] 【发布时间】:2013-08-27 19:19:03 【问题描述】:我正在开发一个派生自另一个类的类,但我被卡住了,使用以下代码:
template <class A, class B, class C>
class BaseClass
public:
BaseClass()
virtual void amethod( A* aPtr=0)
mAPtr=aPtr;
virtual void init()=0;
protected:
A * mAPtr;
B* mBPtr;
C * mCPtr;
;
template <class A,class B,class C>
class ChildClass: public BaseClass<A,B,C>
public:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0):mAPtr(aAptr)
,mBPtr(aBPtr)
,mCPtr(aCPtr)
;
int main()
return 0;
编译器说子类没有任何父字段。
编译器输出:
In constructor 'ChildClass<A, B, C>::ChildClass(A*, B*, C*)'
In constructor 'ChildClass<A, B, C>::ChildClass(A*, B*, C*)'
error: class 'ChildClass<A, B, C>' does not have any field named 'mAPtr'
error: class 'ChildClass<A, B, C>' does not have any field named 'mBPtr'
error: class 'ChildClass<A, B, C>' does not have any field named 'mCPtr'
我在谷歌搜索,但我找不到答案: 提前谢谢
【问题讨论】:
我不确定,但也许你不能用构造函数初始化器初始化继承的字段。尝试在构造函数的主体内初始化它们。 (顺便问一下,这个问题和STL有什么关系?) Visual Studio 2012 完美编译了这段代码。 像@MatteoItalia 一样,我想知道 STL 与此有什么关系。我编辑了问题以反映问题主体中的内容。如果确实如此,请添加有关这如何触及 STL 的详细信息:) @Helix,那是VS2012中的一个错误 【参考方案1】:您不能在派生类构造函数中直接对基成员变量进行构造函数初始化。
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
: mAPtr(aAptr) // <-- Member belongs to parent
, mBPtr(aBPtr) // <-- Member belongs to parent
, mCPtr(aCPtr) // <-- Member belongs to parent
您可以在基本构造函数中默认构造它们并分配它们(因为它们受到保护)
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
mAPtr = aAptr; // <-- Member belongs to parent but you can access it
mBPtr = aBPtr; // <-- Member belongs to parent but you can access it
mCPtr = aCPtr; // <-- Member belongs to parent but you can access it
也可以修改父类构造函数
BaseClass( A* aAptr, B * aBPtr0, C* aCPtr)
: mAPtr(aAptr)
, mBPtr(aBPtr)
, mCPtr(aCPtr)
和
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
: BaseClass(aAptr, aBPtr, aCPtr)
另外,请记住,您需要在派生类中定义一个 void init() 方法
【讨论】:
【参考方案2】:您不能在派生类的构造函数的初始化列表中初始化基类的数据成员。您可以在构造函数的主体中分配它们:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
mAPtr = aAptr;
mBPtr = aBPtr;
mCPtr = aCPtr;
然而,基类看起来设计得很糟糕:它唯一的构造函数根本没有初始化三个数据成员(甚至没有初始化NULL
),所以它们最终包含随机垃圾。在BaseClass
中有一个三参数构造函数来初始化数据成员可能是有意义的; ChildClass
的构造函数会简单地通过它的初始化列表转发给它。
【讨论】:
【参考方案3】:胡安,这段代码:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
mAPtr = aAptr; // <-- Member belongs to parent but you can access it
mBPtr = aBPtr; // <-- Member belongs to parent but you can access it
mCPtr = aCPtr; // <-- Member belongs to parent but you can access it
会给你同样的编译错误,你需要显式写基类,方式如下:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
BaseClass<A,B,C>::mAPtr = aAptr;
BaseClass<A,B,C>::mBPtr = aBPtr;
BaseClass<A,B,C>::mCPtr = aCPtr;
【讨论】:
【参考方案4】:使用上面的anwser,我已经改变了一点:
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
this->mAPtr=aAptr;
this->mBPtr=aBPtr;
this->mCPtr=aCPtr;
没有 this 指针,编译器看不到来自父级的变量。 谢谢!顺便说一句,编译是为 Linux 使用 gcc 编译器 gcc 版本 4.7.3。
【讨论】:
以上是关于派生类模板看不到基类的成员[重复]的主要内容,如果未能解决你的问题,请参考以下文章