c++ - 无法解释的类构造函数调用生成 "matching function error"

标签 c++

当我调用 merge_sort 时,我得到一串错误,最可读的是:

no matching function call to dynamic_array<int>::dynamic_array()

让基类实例化子类是否会导致该子类重新实例化调用基类?

这是我的第一个猜测。

//调用主函数

#include "c_dynamic_array.cpp"
int main()
  {
  dynamic_array<int> d1(20);
  d1.order();cout << d1 << endl;
  d1.rorder();cout << d1 << endl;
  d1.randorder();cout << d1 << endl;
  d1.merge_sort();cout << d1 << endl; // This line starts a string of errors
  }

//动态数组类和Merge Inner(归并排序)类

#include "c_include.cpp"

/*
Dynamic Array
*/

using namespace std;
template <typename> class merge_inner;

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]();
      }
    void merge_sort()
      {
      merge_inner<T> M1;
      }
  };
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()%size;} 
  }
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-1;
  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_inner : public dynamic_array <T>
  {
  using dynamic_array<T>::array;
  private:
    const static int size;
    T *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_inner()
      {
      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 似乎缺少默认构造函数,并且由于它具有自定义构造函数,因此编译器不会提供。将此添加到您的类(class):

  dynamic_array()
  {
      size = 0;
      array = new T[0](); // or NULL, but note that new T[0] will be != NULL
  }

或者,为您现有的构造函数提供一个默认的sizein,这样它也可以用作默认构造函数:

dynamic_array(int sizein = 0)

关于c++ - 无法解释的类构造函数调用生成 "matching function error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016756/

相关文章:

c++ - 为什么这个程序不能在VC++2008Express中编译?

c++ - 在 DirectX 中跨线程传递纹理的数据竞争

c++ - 如何将Qt编译为静态

c++ - 在C++中,如何在不使用if语句的情况下选择运行特定的成员函数?

c++ - 未定义对 Compte 的 vtable 的引用

c++ - 为什么 gdb 不能附加到由 inetd 调用的服务器应用程序?

c++ - 双重发送会产生 'hides virtual function'警告,为什么?

c++ - C++ 计时的纳秒精度

c++ - mingw-w64 : 'undefined reference to ` __getreent. 中的编译器错误 '

c++ - 常量引用包装器