我有调用函数的一个问题:C++隐性/明确的模板法专业化问题
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);
一切都OK,默认参数:
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)
谢谢你们!
无关你的问题,但有你有一个共同的指向容器的特殊原因?这是相当罕见的,在许多情况下不需要。 –
至于你的问题,我个人推广甚至*进一步与模板类型,并使两个第一个参数模板以及。甚至可以使函数模拟几乎所有对容器起作用的[标准算法](http://en.cppreference.com/w/cpp/algorithm)函数,并将两个迭代器作为参数而不是容器(并因此放弃整个'Container'模板参数)。例如,如何使用模板使用'std :: less',为什么不看[[std :: map]](http://en.cppreference.com/w/cpp/container/map)? –
这是我用C++编写的第一批代码之一,现在我正在重构它。指针是让事情对我有用的第一件事。我知道它有多痛苦。一旦我找出为什么它不起作用,我将删除指针。 –