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

时间:2012-02-16 03:00:18

标签: c++ bubble-sort

我正在尝试将自己的冒泡排序算法编写为练习。我不明白这两个错误消息。任何人都可以用我的代码指出问题吗?

// 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;
        }
}

3 个答案:

答案 0 :(得分:7)

我看到你正在使用

using namespace std;

所以当你输入

array[i] = swap;

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

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

答案 1 :(得分:2)

array[i] = swap;

此行导致问题。最好更改swap局部变量的名称,因为在std命名空间中已经存在一个具有相同名称的函数,该命名空间由行using namespace std;引入范围。无论如何都要避免。

我还建议您在if-block中声明变量,其中实际使用:

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命名空间中定义的函数。

答案 2 :(得分:1)

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

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