перегруженная функция без контекстной информации о типе |не может разрешить перегруженную функцию «swap» на основе преобразования в тип «int» - PullRequest
4 голосов
/ 16 февраля 2012

Я пытаюсь написать собственный алгоритм сортировки пузырьков в качестве упражнения.Я не понимаю два сообщения об ошибках.Кто-нибудь может указать на проблему с моим кодом?

// 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 ]

7 голосов
/ 16 февраля 2012

Я вижу, что вы используете

using namespace std;

Поэтому, когда вы набираете

array[i] = swap;

Компилятор не может определить, имеете ли вы в виду функцию std::swap или вашу int swapпеременная.На самом деле это выглядит так, как будто предполагается, что вы ссылались на функцию и пытались каким-то образом преобразовать ее в тип int.Попробуйте переименовать вашу переменную во что-то другое.

В общем, старайтесь держаться подальше от директив using, чтобы избежать подобных конфликтов имен.

2 голосов
/ 16 февраля 2012
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 пространстве имен.

1 голос
/ 16 февраля 2012
cout << "Sorted: " << bubbleSort(array, arraySize);

Возвращаемый тип функции: void. Там не для чего печатать. Если вам нужно распечатать отсортированный массив, вам нужно перебрать элементы массива после вызова функции.

...