基类无法按预期访问受保护的成员
Posted
技术标签:
【中文标题】基类无法按预期访问受保护的成员【英文标题】:protected member is not accessible by base class as expected 【发布时间】:2011-11-04 21:56:20 【问题描述】:我从 dynamic_array 派生的类 merge_sort 无权访问受保护的成员 T* 数组。它们在任何地方都是错误的。
我不知道为什么……除非 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);
*/
【问题讨论】:
错误信息是什么,你会从哪里得到它? 错误数组未在此范围内声明 如果你发布一个最小的测试用例会更有用,因为我确信你模糊谈论的问题(为什么不至少告诉一个有问题的行,为什么注释掉的代码?)可以在几行中复制。也没有多少人能够解析“他们到处都是错误的说法?” 这个问题真的是和***.com/questions/1624564/…重复了 【参考方案1】:您的基类依赖于模板参数,因此它的类型是依赖类型。在实例化之前,编译器不会知道您使用的基类的哪个特化,因此您必须帮助编译器知道这样的标识符是基类的成员。像这样:
dynamic_array<T>::array
或
this->array
或
using dynamic_array<T>::array;
【讨论】:
谢谢...就语法而言,我开始为我的 dynamic_array 使用的一个模板现在到处都是...谢谢 我可以为 dynamic_arraydynamic_array<T>::array
不是类型,所以你不能使用typedef
。将using dynamic_array<T>::array;
放在您的班级中,它将使基本成员仅使用array
可见。
放在哪里?在我的课上?在公共部分下?
@Chris Aaker:如果您将其放在public
部分下,您刚刚将其可见性更改为public
。将其放在protected
部分下。以上是关于基类无法按预期访问受保护的成员的主要内容,如果未能解决你的问题,请参考以下文章