在另一个错误中调用一个函数:"no matching function for call to `merge(int*&, int&, int&, int&)"

Calling one function inside of another error: "no matching function for call to `merge(int*&, int&, int&, int&)"

本文关键字:int to call merge 另一个 错误 for function 一个 调用 函数      更新时间:2023-10-16

使用了两个函数merge()和mergesort()。mergessort()正在尝试调用merge,但显示"no matching function"错误。

使用类编写以下代码时不会遇到相同的错误

#include<iostream>
    using namespace std;

    //MERGE SORT
    void mergesort(int arr[],int l,int h)
    {
         int m=(l+h)/2;
         if(l<h)
         {
                mergesort(arr,l,m-1);
                mergesort(arr,m,h);
                merge(arr,l,h,m);
         }
    }
    //CALLING THIS FUNCTION IN mergesort() IS GIVING AN ERROR
    void merge(int arr[],int l,int h,int m)
    {
         int a1[m-l];
         int a2[h-m+1];
         int i=l,j=m,ptr=0;
         while(i<m&&j<h+1)
         {
                         if(a1[i]<a2[j])
                         {
                                        arr[ptr++]=a1[i++];
                         }
                         else
                         {
                             arr[ptr++]=a2[j++];
                         }
         }
         if(i<m)
         {
                for(int k=i;k<m;k++)
                {
                        arr[ptr++]=a1[k];
                }
         }
         else
         {
             for(int k=j;k<h+1;k++)
                {
                        arr[ptr++]=a2[k];
                }
         }
    }
    void printarray(int arr[], int n)
    {
         for(int i=0;i<n;i++)
         cout<<arr[i];
    }
    int main()
    {
        int arr[]={12, 11, 13, 5, 6, 7};
        mergesort(arr,0,5);
        printarray(arr,6);
        return(0);
    }

你需要先声明合并函数,因为编译器不知道应该接受多少个参数,每个参数是什么类型

#include<iostream>
using namespace std;
void merge (int [], int, int, int);
//MERGE SORT
void mergesort(int arr[],int l,int h)
{
     int m=(l+h)/2;
     if(l<h)
     {
            mergesort(arr,l,m-1);
            mergesort(arr,m,h);
            merge(arr,l,h,m);
     }
}
//CALLING THIS FUNCTION IN mergesort() IS GIVING AN ERROR
void merge(int arr[],int l,int h,int m)
{
     int a1[m-l];
     int a2[h-m+1];
     int i=l,j=m,ptr=0;
     while(i<m&&j<h+1)
     {
                     if(a1[i]<a2[j])
                     {
                                    arr[ptr++]=a1[i++];
                     }
                     else
                     {
                         arr[ptr++]=a2[j++];
                     }
     }
     if(i<m)
     {
            for(int k=i;k<m;k++)
            {
                    arr[ptr++]=a1[k];
            }
     }
     else
     {
         for(int k=j;k<h+1;k++)
            {
                    arr[ptr++]=a2[k];
            }
     }
}
void printarray(int arr[], int n)
{
     for(int i=0;i<n;i++)
     cout<<arr[i];
}
int main()
{
    int arr[]={12, 11, 13, 5, 6, 7};
    mergesort(arr,0,5);
    printarray(arr,6);
    return(0);
}

您必须将这一行放在mergesort函数声明之前:

void merge(int arr[],int l,int h,int m);

或者,您可以交换函数mergemergesort,以便后者在前者之前声明。

一般来说,不能引用没有在任何地方声明的函数。上面的代码行介绍了merge函数,即使该定义在mergesort on之后被搁置。这样,该函数的原型是已知的,并且可以在另一个函数中使用它。