为什么我不能将运算符传递给 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);
}
此外,在使用函数之前,您应该有该函数的声明。请参阅上面链接的工作演示。
我改变了两件事:
在调用 fooFunction2(..)
时,不要传递 comp()
,而是传递 comp
。
如果添加括号,则会执行 comp-function,这会失败,因为比较函数需要传递给它的参数。只是传递 comp
而只是告诉它在哪里寻找有问题的函数。
将 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;
}
在我的 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);
}
此外,在使用函数之前,您应该有该函数的声明。请参阅上面链接的工作演示。
我改变了两件事:
在调用
fooFunction2(..)
时,不要传递comp()
,而是传递comp
。 如果添加括号,则会执行 comp-function,这会失败,因为比较函数需要传递给它的参数。只是传递comp
而只是告诉它在哪里寻找有问题的函数。将
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; }