【问题标题】:overloaded function with no contextual type information | cannot resolve overloaded function 'swap' based on conversion to type 'int'没有上下文类型信息的重载函数|无法基于转换为“int”类型来解析重载函数“swap”
【发布时间】:2012-03-07 11:25:30
【问题描述】:

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

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

【问题讨论】:

  • 错误信息在哪里?
  • 对不起:没有上下文类型信息的重载函数无法根据转换为类型'int'来解析重载函数'swap'
  • 他在询问编译器在错误中给出的行号。

标签: c++ bubble-sort


【解决方案1】:

我看到你正在使用

using namespace std;

所以当你输入

array[i] = swap;

编译器无法区分您指的是std::swap 函数还是int swap 变量。事实上,它看起来像是假设您指的是该函数并试图以某种方式将其转换为类型int。尝试将您的变量重命名为其他名称。

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

【讨论】:

    【解决方案2】:
    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 命名空间中定义的函数。

    【讨论】:

    • 哦...我不知道“上下文类型信息”,可以像这样显式给出。
    • @iammilind:当你重载函数时,这很常见,然后你提到函数的 type,无论是显式转换,还是作为目标类型。比如说,你的项目中有很多名称为f 的重载函数,那么auto x = f 会给出编译错误,说函数名称不明确。要解决它,您可以编写ftype x = fauto x = (ftype)f,其中ftype 是您打算使用的函数的类型。
    【解决方案3】:
    cout << "Sorted: " << bubbleSort(array, arraySize);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 2021-10-02
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多