如何修复<function-style-cast>错误:无法从“初始化列表”转换为asdendingCompare <w>(模板函子)

时间:2019-03-31 18:53:35

标签: c++ visual-studio compiler-errors

我正在尝试使用模板函子(ascendingCompare)比较两个值并将其用于对数组进行排序的模板函数(Sort)

功能键

classpath 'com.google.gms:google-services:4.2.0'

排序功能与交换值的功能

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]);*/
}

所以编译器会出现此C2440错误:无法从“初始化列表”转换为“ ascendingCompare”

1 个答案:

答案 0 :(得分:1)

如上所述。

在尝试触发operator()之前,您从未创建过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]) )