基类无法按预期访问受保护的成员

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_array::array 使用 typedef 以使其更简洁吗? @Chris Aaker:dynamic_array&lt;T&gt;::array 不是类型,所以你不能使用typedef。将using dynamic_array&lt;T&gt;::array; 放在您的班级中,它将使基本成员仅使用array 可见。 放在哪里?在我的课上?在公共部分下? @Chris Aaker:如果您将其放在public 部分下,您刚刚将其可见性更改为public。将其放在protected 部分下。

以上是关于基类无法按预期访问受保护的成员的主要内容,如果未能解决你的问题,请参考以下文章

无法访问基类中的受保护成员 [重复]

无法从派生类构造函数参数访问受保护的基类成员[重复]

在派生类中无法访问受保护的成员

访问基类的受保护成员

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

eclipse C++ 中无法识别受保护的成员