没有上下文类型信息的重载函数 |无法根据转换为类型 'int' 解析重载函数'swap'



我正在尝试编写自己的冒泡排序算法作为练习。我不明白这两条错误信息。有人能指出我代码的问题吗?

// Bubble sort algorithm
#include <iostream>
#include <iomanip>
using namespace std;
void bubbleSort(int array[], int arraySize); // bubbleSort prototype
int main(void)
{
        const int arraySize = 10;
        int array[arraySize] = {2,3,6,5,7,8,9,3,7,4};
        cout << "Unsorted: ";
        for(int i = 0; i < arraySize; ++i)
                cout << setw(5) << array[i];
        cout << "Sorted: " << bubbleSort(array, arraySize);
}
void bubbleSort(int array[], int arraySize)
{
        const int max = arraySize;
        int swap = 0;
        for(int i = 0; i < max; ++i)
        {
                if(array[i] > array[i + 1])
                {
                        swap = array[i + 1];
                        array[i + 1] = array[i];
                        array[i] = swap;
                }
                else
                        break;
        }
}

我看到您正在使用

using namespace std;

所以当你输入时

array[i] = swap;

编译器无法消除您引用的是std::swap函数还是int swap变量的歧义。事实上,它似乎假设您引用了该函数,并试图以某种方式将其转换为类型int。尝试将变量重命名为其他变量。

一般来说,尽量远离using指令,以避免像这样的名称冲突。

array[i] = swap;

这条线路出了问题。最好更改swap局部变量的名称,因为在std命名空间中已经存在具有相同名称的函数,该命名空间由using namespace std;行带入范围,无论如何都要避免。

我还建议您在if块内声明变量,其中实际使用

if(array[i] > array[i + 1])
{
     //declare temp here where it is actually used!
     int temp = array[i + 1]; 
     array[i + 1] = array[i];
     array[i] = temp;
}

最佳实践:通过延迟局部变量的声明来减少它们的作用域,这意味着在实际使用它们的地方声明它们。不要在函数的开头声明它们。

另一种解决代码中问题的方法是给编译器一个上下文,你可以通过这样做(尽管我不建议这个解决方案;它只是让你知道):

array[i] = (int)swap; //giving compiler contextual type information

当您将swap强制转换为int时,编译器可以知道swap指的是局部变量,而不是std命名空间中定义的函数。

cout << "Sorted: " << bubbleSort(array, arraySize);

函数的返回类型为void。没有什么可打印的。如果需要打印排序后的数组,则需要在函数调用后对数组元素进行迭代。

最新更新