为什么我不能将运算符传递给 C++ 中另一个函数?

Why can't I pass operator to a function from an other in C++?

在我的 C++ 作业中(我必须用不同的方法缩短不同的数组),我 运行 遇到了一个问题。我无法将 comp() 从一个函数传递到另一个函数。

这是我的代码的简化版本:

template <typename T, typename Compare = std::less<T>>
void fooFunction(T arr[], int arraySize, Compare comp = Compare{})
{
    int endElem=arraySize-1;
    int beginElem =0;
    fooFunction2(arr, beginElem , endElem, arraySize, comp()); //I am getting the errors here
}

template <typename T, typename Compare = std::less<T>>
void fooFunction2(T arr[], int beginElem, int endElem, int arraySize, Compare comp = Compare{})
{
    
}

struct string_size_less
{
    bool operator()(const std::string &a, const std::string &b) const
    {
        return a.size() < b.size();
    }
};

int main()
{
    int arrI[] = { 4, 5, 1, 4, 2};
    std::string arrS[] = {"Car", "Bicycle", "Metro", "Bike"};

    fooFunction(arrI, 5);
    fooFunction(arrS, 4, string_size_less());
    return 0;
}

目前我得到:

error: no match for call to '(std::less<int>) ()'|
error: 'fooFunction2' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]|

解决这个问题的正确方法是什么?

问题 是您将 comp() 作为最后一个参数传递,而不是传递 comp

为了解决这个通过comp而不是comp()如下所示:

struct string_size_less
{
    bool operator()(const std::string &a, const std::string &b) const
    {
        return a.size() < b.size();
    }
};

template <typename T, typename Compare = std::less<T>>
void fooFunction2(T arr[], int beginElem, int endElem, int arraySize, Compare comp = Compare{})
{
    
}
template <typename T, typename Compare = std::less<T>>
void fooFunction(T arr[], int arraySize, Compare comp = Compare{})
{
    int endElem=arraySize-1;
    int beginElem =0;
//----------------------------------------------------vvvv--->changed from comp() to comp
    fooFunction2(arr, beginElem , endElem, arraySize, comp);
}

Working demo

此外,在使用函数之前,您应该有该函数的声明。请参阅上面链接的工作演示。

我改变了两件事:

  1. 在调用 fooFunction2(..) 时,不要传递 comp(),而是传递 comp。 如果添加括号,则会执行 comp-function,这会失败,因为比较函数需要传递给它的参数。只是传递 comp 而只是告诉它在哪里寻找有问题的函数。

  2. fooFunction2(..) 的定义放在您调用它的上方。如果您稍后定义它,编译器将不会在找到第一次调用时找到该定义。 (可能有编译器选项来解决这个问题)。只需交换定义就足以修复它,尽管在头文件中声明它(尤其是在较大的项目中)可能是一种更顺畅的方法。 这段代码编译得很好:

     template <typename T, typename Compare = std::less<T>>
     void fooFunction2(T arr[], int beginElem, int endElem, int arraySize, Compare comp = Compare{})
     {
    
     }
    
     template <typename T, typename Compare = std::less<T>>
     void fooFunction(T arr[], int arraySize, Compare comp = Compare{})
     {
         int endElem=arraySize-1;
         int beginElem =0;
         fooFunction2(arr, beginElem , endElem, arraySize, comp); //I am getting the errors here
     }
    
    
     struct string_size_less
     {
         bool operator()(const std::string &a, const std::string &b) const
         {
             return a.size() < b.size();
         }
     };
    
     int main()
     {
     int arrI[] = { 4, 5, 1, 4, 2};
     std::string arrS[] = {"Car", "Bicycle", "Metro", "Bike"};
    
     fooFunction(arrI, 5);
     fooFunction(arrS, 4, string_size_less());
     return 0;
     }