Вот более идиоматический и общий подход:
template<typename K, typename T>
class AVLTree
{
...
template <typename Comparer>
void foo(Comparer cmp) {
...
int res = cmp(key1, key2);
...
}
...
};
Comparer не должен быть типом, который определяет статический Compare
метод. Это должен быть тип, который можно вызывать с синтаксисом вызова функции. Это позволяет вам использовать указатели функций на объекты функций и позволяет повторно использовать компараторы, уже определенные в стандартной библиотеке или практически во всех других нетривиальных приложениях C ++. Это позволяет вам использовать лямбды, когда они добавляются в C ++ 0x.
Как заставить Comparer
вести себя как ожидалось? Линия int res = cmp(key1, key2);
уже гарантирует это. Если вы попытаетесь передать тип, который не может быть вызван таким образом, вы получите ошибку компиляции.
То же самое было в вашем исходном коде. Если вы передадите тип, у которого нет статического метода Compare
, вы получите ошибку компиляции. Итак, ваш оригинальный код уже решил проблему.