基类无法按预期访问受保护的成员
protected member is not accessible by base class as expected
我的派生类merge_sort从dynamic_array没有访问受保护的成员T* array。这样说到处都是错误的。
我不知道为什么……也许merge_sort的公共指示符应该是别的?
#include "c_include.cpp"
using namespace std;
template <class T> class dynamic_array
{
protected:
T* array;
public:
int size;
void rorder();
void order();
void randorder();
void print_operator(ostream&)const;
dynamic_array(int sizein)
{
size=sizein;
array=new T[size]();
}
};
template <class T> void dynamic_array<T>::print_operator(ostream &os=cout)const
{
for (int i = 0; i < size; i++) os << array[i] << endl;
}
template <class T> void dynamic_array<T>::randorder()
{
srand(time(NULL));
int *ap;
for(ap=array;ap!=array+size;++ap){*ap=rand();}
}
template <class T> void dynamic_array<T>::order()
{
int *ap,i=0;
for(ap=array;ap!=array+size;++ap)
{
*ap=i;
++i;
}
}
template <class T> void dynamic_array<T>::rorder()
{
int *ap,i=size;
for(ap=array;ap!=array+size;++ap)
{
*ap=i;
--i;
}
}
template<class T> ostream& operator<<(ostream& stream, dynamic_array<T> const& data)
{
data.print_operator(stream);
return stream;
}
/*
Merge Sort
*/
template <class T> class merge_sort : public dynamic_array <T>
{
private:
const static int size;
int scratch[];
void flip_if_unordered(int &x, int &y)
{
if(array[x]>array[y])
{
int tmp=array[x];
array[x]=array[y];
array[y]=tmp;
}
}
void merge_algo(int &left, int &right_begin, int &right)
{
int iter,iter_left=left,iter_right=right_begin;
for(iter=left;iter<=right;++iter)
{
if( (iter_right>right) || ((iter_left < right_begin) && (array[iter_left]<=array[iter_right])))
{
scratch[iter]=array[iter_left];
++iter_left;
}
else
{
scratch[iter]=array[iter_right];
++iter_right;
}
}
for(iter=left;iter<=right;++iter){array[iter]=scratch[iter];}
}
void merge_recurse(int left,int right)
{
int left_end=(left+((right-left)/2));
int right_begin=left_end+1;
if(((left+1)==right)){flip_if_unordered(left,right);return;}
else if ((left==right)){return;}
else
{
merge_recurse(left,left_end);
merge_recurse(right_begin,right);
merge_algo(left,right_begin,right);
}
}
public:
merge_sort()
{
scratch = new T[size]();
if(scratch != NULL)
{
merge_recurse(0, size);
}
}
};
/*Quick Sort
void quick_sort()
{
quick_recurse(0,size);
}
void quick_recurse(int left, int right)
{
int l = left, r = right, tmp;
int pivot = array[(left + right) / 2];
while (l <= r)
{
while (array[l] < pivot)l++;
while (array[r] > pivot)r--;
if (l <= r)
{
tmp = array[l];
array[l] = array[r];
array[r] = tmp;
l++;
r--;
}
}
if (left < r)quick_recurse(left, r);
if (l < right)quick_recurse(l, right);
}
*/
您的基类依赖于模板参数,因此它的类型是依赖类型。在实例化之前,编译器不会知道您使用的基类的哪个专门化,因此您必须帮助编译器知道这样的标识符是基类的成员。或者像这样:
dynamic_array<T>::array
或
this->array
或
using dynamic_array<T>::array;
相关文章:
- 继承和友元函数,从基类访问受保护的成员
- C++:为什么无法在派生类中访问受保护的构造函数?
- 如何从其他结构访问受保护的结构变量
- 从模板化父类中的派生内部类访问受保护的成员变量
- 有没有办法通过 main 函数访问受保护的矢量大小而无需将其转换为公共?
- 在派生类的构造函数初始化中无法访问受保护的函数
- 无法通过指针或对象 c++ 访问受保护的成员
- C 继承访问受保护的数据成员
- 访问受保护的成员
- 尝试从基类访问受保护的构造函数时出现错误 C2248
- 如何通过运算符<<的重载访问受保护的功能?C++
- 从公共派生类访问受保护的成员
- Boost单元测试夹具继承测试类,是否可以访问受保护的方法
- 如果我使用强制转换访问受保护的成员,可能会出现什么问题?
- 通过继承访问受保护的成员
- 访问受保护的变量 - 继承和子类的复杂情况
- 为什么我无法从基类的实例访问受保护的成员?
- 访问受保护成员的公共方法
- 通过好友访问受保护的成员
- 从另一个类 C++ 访问受保护的函数