C++ 在默认参数中将依赖作用域用作std::less的类型时出现编译错误

C++ 在默认参数中将依赖作用域用作std::less的类型时出现编译错误,c++,templates,stl,C++,Templates,Stl,在我添加第二个参数以使其更通用之前,下面的怪物工作正常: template<class IterableType, class Comparator> typename IterableType::iterator GetMinimum(IterableType collection, Comparator comparator = std::less<typename IterableType::iterator> ) { typ

在我添加第二个参数以使其更通用之前,下面的怪物工作正常:

template<class IterableType, class Comparator>
typename IterableType::iterator GetMinimum(IterableType collection, Comparator comparator =
        std::less<typename IterableType::iterator>
        )
{
    typename IterableType::iterator iter = collection.begin();
    typename IterableType::iterator result = iter;

    for(; iter != collection.end(); ++iter)
    {
        if(comparator(iter, result))
            result = iter;
    }

    return result;
}
对于行号:

118: template<class IterableType, class Comparator>
119: typename IterableType::iterator GetMinimum(IterableType collection, Comparator comparator =
120:         std::less<typename IterableType::iterator>
121:         )
118:模板
119:typename IterableType::迭代器GetMinimum(IterableType集合,Comparator Comparator=
120:std::更少
121:         )
我已经#包括了
,所以
std::less
是有效的。有人能指出我做错了什么吗?

你需要说

Comparator comparator = std::less<typename IterableType::iterator>()

它将默认构造用户选择的任何比较器类型。

签名应为:

template<
    class IterableType,
    class Comparator = std::less<typename IterableType::iterator> >
typename IterableType::iterator
GetMinimum(IterableType collection, Comparator comparator)
模板<
类IterableType,
类比较器=std::less>
类型名IterableType::迭代器
GetMinimum(IterableType集合、比较器比较器)
将默认值移动到模板参数中

对于默认模板参数和默认参数

template<
    class IterableType,
    class Comparator = std::less<typename IterableType::iterator> >
typename IterableType::iterator
GetMinimum(
    IterableType collection, Comparator comparator = Comparator() )
模板<
类IterableType,
类比较器=std::less>
类型名IterableType::迭代器
获取最小值(
IterableType集合,Comparator Comparator=Comparator()
std::less
是一种类型。如果要将其用作参数的默认值,即
std::less()
,则需要实例化它


但是,这种方法无论如何都不会起作用,因为编译器无法使用参数的默认值推断模板参数。STL处理这个问题的方法就是重载函数,提供一个模板,该模板接受一个额外的比较器参数,另一个模板不接受(并且只使用
std::less
)。例如,请参见

谢谢特里斯坦,第一种方法奏效了!稍后我还会尝试其他建议。对不起,我要纠正一下,第一种方法不起作用。此代码是共享库的一部分,并已编译。但在尝试使用代码时,我确实遇到了错误:模板参数推断/替换失败。对第一种方法进行编辑并删除是明智的。@battery好吧,公平地说,我确实说过我认为它不起作用!第二种方法是正确的方法。我将编辑答案,以防将来有人遇到这个问题。
template<
    class IterableType,
    class Comparator = std::less<typename IterableType::iterator> >
typename IterableType::iterator
GetMinimum(IterableType collection, Comparator comparator)
template<
    class IterableType,
    class Comparator = std::less<typename IterableType::iterator> >
typename IterableType::iterator
GetMinimum(
    IterableType collection, Comparator comparator = Comparator() )