可以肯定的是,根据我阅读和尝试过的内容,我不能在函数模板中放置默认参数,对吗?我从我的编译器和其他人的回应中学到了很多东西……我问是因为我是新手,一些更技术性的回应很难理解。有解决办法吗?我正在尝试创建一个使用默认关系运算符但可以选择重载的 findmax 函数...即:
template <typename Type, typename Compare = std::less<Type> >
Type FindMax(std:vector<Type> &vec, Compare comp = Compare()) {
return *std::max_element(...
}
我想我可以为此创建一个类,但当我真正想要的只是一个函数时,这似乎需要做很多工作...谢谢!
我还应该添加另一个关于我之前看到的问题的问题:
这个函数模板是做什么的,具体来说,(cmpFn)...) 默认参数在做什么?
template <typename ElemType>
ElemType FindMax(Vector<ElemType> &v, int (cmpFn)(ElemType, ElemType) = OperatorCmp)
最佳答案
有很多话要说:
您定义的是函数模板,而不是类模板。由于您使用的是默认模板参数
typename Compare = std::less<Type>
我假设您已经在使用 C++11,因为据我所知,在以前的标准版本中,函数模板不允许使用默认模板参数。
另一方面,像这样的模板参数的默认参数
Compare comp = Compare()
在以前的标准版本中也是可能的。您关于模板化参数无法使用默认参数的说法是错误的(或者它实际上指的是我在上面所说的默认模板参数)。
您收到的编译器错误消息一定是由于其他问题引起的。也许
Type
你最终使用不适合std::less
,或Compare
您使用的类型未实现默认构造函数。无论如何,以下程序在 GCC 4.6.2 上编译(请注意,我将std::vector<> &
更改为const std::vector<> &
因为这看起来更正确):
#include <vector>
#include <functional>
#include <algorithm>
template <typename Type, typename Compare = std::less<Type> >
Type FindMax(const std::vector<Type> &vec, Compare comp = Compare()) {
return *std::max_element(vec.begin(),vec.end(),comp);
}
int main() {
FindMax(std::vector<int>());
return 0;
}
确实这需要 -std=C++0x
选项,但那是因为默认模板参数,而不是默认参数。
关于与cmpFn
相关的额外问题:
它声明了一个函数参数,即一个本身就是函数的参数。声明
int (cmpFn)(ElemType, ElemType)
表示函数的本地名称是cmpFn
, 它的返回类型是 int
, 它有两个参数,都是 ElemType
类型.这个想法是调用者可以传递一个函数(或仿函数),然后将用于比较 vector 的元素。例如。如果您定义该参数的默认值 OperatorCmp
在这样的函数声明之前:
int OperatorCmp(int a, int b) {
return (a<b?-1:(a>b?1:0));
}
声明生效,您可以使用它来查找 std::vector<int>
的最大值.
关于c++ - 函数模板 C++ 中的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9627950/