如果我有这种层次结构:
#include <iostream>
using namespace std;
template<class T>
class typeB;
template<class T>
class typeA
{
// Private data
T* x_;
int size_;
public:
// Constructors
typeA()
: x_(0), size_(0)
{
};
typeA(int size)
: x_(0), size_(size)
{
}
// Friend classes.
friend class typeB<T>;
};
template<class T>
class typeB
: public typeA<T>
{
public:
// Constructors
typeB ()
{
};
typeB (int size)
: typeA<T>(size)
{
//this->x_ = new T[size];
x_ = new T[size];
}
};
int main()
{
typeB<int> b(4);
return 0;
}
为什么我需要在typeB(int size)构造函数中指定“this-&gt; x_ = new T [size]”而不是“x_ = new T [size]”才能编译此代码?
编译器告诉我的是它无法解析x _:
的类型main.cpp: In constructor ‘typeB<T>::typeB(int)’:
main.cpp:42: error: ‘x_’ was not declared in this scope
如果typeB是typeA的朋友,它应该具有对typeA属性的公共访问权。如果我尝试使用非模板化的类,它可以工作:
#include <iostream>
using namespace std;
class typeB;
class typeA
{
// Private data
int* x_;
int size_;
public:
// Constructors
typeA()
: x_(0), size_(0)
{
};
typeA(int size)
: x_(0), size_(size)
{
}
// Friend classes.
friend class typeB;
};
class typeB
: public typeA
{
public:
// Constructors
typeB ()
{
};
typeB (int size)
: typeA(size)
{
x_ = new int[size];
}
};
int main()
{
typeB b(4);
return 0;
}
typeA和typeB是一种列表容器:您认为这种关系的动机是什么(公共继承+朋友,如果需要直接访问,则将x_和size_作为受保护的属性)?
答案 0 :(得分:3)
首先,成员x_
是基类的私有成员。友谊不会有帮助,因为你试图通过继承来访问成员。
即使您使其受保护或公开,模板基类的成员也不会在派生类中自动显示。
解决方案是:
明确使用this->
,
this->x_ = new int[size];
或者将名称带入派生类范围:
template<class T>
class typeB : public typeA<T>
{
using typeA<T>::x_; //brings the name x_ into the class scope!
//...
然后你可以写
x_ = new int[size];