Как исправить ошибку <function-style-cast>: невозможно преобразовать из «списка инициализаторов» в asdendingCompare <W>(функтор шаблона) - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь использовать шаблонный функтор (ascendingCompare) для сравнения двух значений и использовать его в шаблонной функции (Сортировка), которая сортирует массив

Функтор

template<typename Q>
class ascendingCompare
{
public:
    bool operator () (const Q &first, const Q &second)
    {
        if (first < second)
            return true;
        else
            return false;
    }
};

Функция сортировки вместе с функциейдля обмена значениями

template <typename Q>
void Swap(Q &first, Q &second)
{
    Q temp = first;
    first = second;
    second = temp;
}

template <typename W>
void sortAscend(W *arr, int size)
{
    for (int i = 0; i < size - 1; i++)
        for (int j = 0; j < size - 1 - i; j++)
            if (ascendingCompare<W>( arr[j + 1], arr[j]) )
                Swap(arr[j + 1], arr[j]);
            /*if (arr[j + 1] < arr[j])
                Swap(arr[j + 1], arr[j]);*/
}

Часть, в которой используется функтор

int *sorted_array = new int[array_size]; 
    for (int counter = 0; counter < array_size; counter++)
    {
        sorted_array[counter] = rand() % 100; 
        cout << setw(2) << sorted_array[counter] << "  ";
    }
sortAscend(sorted_array, array_size);

Таким образом, компилятор выдает эту ошибку C2440: Невозможно преобразовать из «списка инициализатора» в «ascendingCompare»

1 Ответ

1 голос
/ 31 марта 2019

Как уже было сказано выше

Вы никогда не делали экземпляр ascendingCompare до попытки запуска оператора ().Ваш ascendingCompare (arr [j + 1], arr [j]) пытается построить из этих аргументов, что явно неверно.

Таким образом, правильная форма будет

template <typename W>
void sortAscend(W *arr, int size)
{
    for (int i = 0; i < size - 1; i++)
        for (int j = 0; j < size - 1 - i; j++)
            if (ascendingCompare<W>()( arr[j + 1], arr[j]) )
                Swap(arr[j + 1], arr[j]);
            /*if (arr[j + 1] < arr[j])
                Swap(arr[j + 1], arr[j]);*/
}

если вы не понимаете, что на самом деле изменилось

старые версии

if (ascendingCompare<W>( arr[j + 1], arr[j]) )

новые версии

if (ascendingCompare<W>()( arr[j + 1], arr[j]) )
...