我正在实现一个简单的排序算法,只是为了了解C ++模板的工作原理。 我需要使用不同类型的元素对数组进行排序,因此我需要使用不同的函数来比较它们。例如,我想通过他们的效率对足球运动员阵列进行排序。我用结构编写了仿函数并以这种方式使用它:
insertionSort(players, 0, players.size() - 1, Player());
但是在insertSort中我需要将比较器 c 传递给另一个函数:
less(input[j], input[j-1], c); // can I do so?
这是我的代码:
struct Player
{
int number;
ulong efficiency;
Player(int numb, ulong ef) : number(numb), efficiency(ef) {}
Player() : number(0), efficiency(0) {}
// functor for comparing players by efficiency
bool operator() (const Player &left, const Player &right)
{
return left.efficiency < right.efficiency;
}
};
// template function for comparing various elements
template<typename T, typename Comp = std::less<T> >
bool less (const T &left, const T &right, Comp c = Comp())
{
return c(left, right);
}
template <typename T>
void swap (T &a, T &b)
{
T tempr = a;
a = b;
b = tempr;
}
template<typename T, typename Comp = std::less<T> >
void insertionSort (vector<T>& input, int begin, int end, Comp c = Comp())
{
for (int i = begin; i <= end; ++i)
for (int j = i; j > begin && less(input[j], input[j-1], c); --j)
swap(input[j], input[j-1]);
}
现在我有以下编译错误:“默认模板参数只允许在函数 less 中使用类模板”和另一个模板函数。拜托,请问,我做错了什么?我无法找出我的错误在哪里。谢谢您的帮助!
答案 0 :(得分:1)
您可能正在编译C ++ 03模式,并且不允许在那里使用函数的默认模板参数。有关详细信息,请参阅this SO question。因此,如果您需要默认模板参数,则可以切换到C ++ 11或使用函子而不是函数。
使用类Player
作为比较器可以工作,但每次调用insertionSort
时都必须实例化它,因为类不为空,所以不是免费的。{1}}。使用单独的仿函数来比较玩家似乎更有效。
此外,您无需在less
中调用insertionSort
方法,直接调用比较器就足够了。 (c(input[j], input[j-1])
)。
另一种解决方案是专门化std::less<Player>
并始终使用std::less
进行比较。请refer to this SO question。
答案 1 :(得分:0)
我收回clang的消息非常清楚。
“函数模板的默认模板参数是C ++ 11扩展。”
这是C ++ 98中缺少的一个功能,后来在C ++ 11中添加了它。