C ++隐式/显式模板方法专业化问题

时间:2017-07-14 20:14:33

标签: c++ templates generic-programming

我在调用函数时遇到问题:

namespace Sort {

    enum Type {
        insertion, selection, merge
    };

    template <class Elem = int, class Container = std::vector<Elem>>
    void sort(std::shared_ptr<Container> vectorPointer,
              std::function<bool(Elem, Elem)> comparator = std::less<Elem>(),
              Type type = selection) {

        switch (type) {
            case insertion:
                insertionSort(vectorPointer, comparator);
            case selection:
                selectionSort(vectorPointer, comparator);
            case merge:
                mergeSort(vectorPointer, comparator);
        }
    }
}

当我这样称呼它时:

std::shared_ptr<std::vector<int>> intVector;

Sort::sort(intVector);

一切正常,但是如果我开始更换默认参数:

Sort::sort(intVector, std::less<int>(), merge);

我收到一条错误消息:Candidate template ignored: could not match 'function' against 'less'

更新

我终于让它工作了 - 明确地专门化函数调用似乎可以解决问题。另外,我没有为枚举值提供命名空间。

Sort::sort<int, std::vector<int>>(intVector, std::less<int>(), Sort::merge)

谢谢你们!

2 个答案:

答案 0 :(得分:2)

 template <class Elem = int, class Container = std::vector<Elem>>
    void sort(std::shared_ptr<Container> vectorPointer,
              std::function<bool(Elem, Elem)> comparator = std::less<Elem>(),
              Type type = selection)

比较器类型取决于模板参数Elem,因此当编译器执行模板推导规则时,它要求调用者提供的值具有与参数的类型模式匹配的类型。由于'less'和'function'不是同一类型,因此该函数不是有效匹配。

(不要混淆类型推导逻辑与处理这些类型的实例时允许的转换序列相同。)

如果您将通话改为看起来像这样,那么它会起作用(尽管由于糟糕的用户体验,显然您不希望这样做):

Sort::sort(shV, std::function<bool(int, int)>(std::less<int>()), Sort::merge);

这样,第二个参数的类型与模板所期望的匹配。  上面的例子也解决了你对'merge'枚举器的使用,它在Sort命名空间中并且需要命名空间限定。

对您的签名进行小的更改,将Compare作为另一个模板参数,是可能的:

template <class Elem = int, class Container = std::vector<Elem>, 
          class Compare = std::less<Elem>>
void sort(std::shared_ptr<Container> vectorPointer,
      Compare comparator = Compare(),
      Type type = selection) {
    switch (type) {
        // ...
    }

答案 1 :(得分:1)

你的std::function<bool(Elem, Elem)> comparator应该是 如果您使用的是C ++ 14,则std::function<bool(const Elem&, const Elem&)>std::function<bool(auto,auto)>