成员函数接受模板函数指针时出现问题

时间:2018-11-12 05:10:19

标签: c++

我正在尝试在我的time_to_active <= 0类上创建一个成员方法以进行排序。我在类中键入了两个函数指针,一个用于通用排序方法,另一个用于比较器。我在浏览错误时很难确定我所说的方式到底出了什么问题。我希望我提供了足够的信息,但这就是我所得到的。

我得到的错误:

array

我在这里定义我的main.cpp: In function ‘int main(int, char**)’: main.cpp:222:67: error: no matching function for call to ‘array<int>::sort(<unresolved overloaded function type>, <unresolved overloaded function type>)’ sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>); ^ main.cpp:55:6: note: candidate: void array<T>::sort(array<T>::p_sort_func, array<T>::p_comparator_func) [with T = int; array<T>::p_sort_func = void (*)(array<int>&, bool (*)(int, int)); array<T>::p_comparator_func = bool (*)(int, int)] void array<T>::sort(array<T>::p_sort_func sort_func, ^~~~~~~~ main.cpp:55:6: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘array<int>::p_sort_func {aka void (*)(array<int>&, bool (*)(int, int))}’

typedefs

我的排序实现:

template <typename T>
class array {
 public:
  typedef bool (*p_comparator_func)(T a, T b); 
  typedef void (*p_sort_func)(class array<T> &array, p_comparator_func);
  ...
  void sort(array::p_sort_func sort_func,
      array::p_comparator_func comparator_func);

  ...
}

我要传递的排序函数:

template <typename T>
void array<T>::sort(array<T>::p_sort_func sort_func,
                    array<T>::p_comparator_func comparator_func)
{
  if(comparator_func == nullptr) {
    comparator_func = this->default_comparator;
  }

  if(sort_func == nullptr) {
    sort_func = this->default_sort;
  }

  sort_func(*this, comparator_func);
}

我的自定义比较器:

template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
  class array<T>::p_comparator_func comparator)
{
  insertion_sort_recursive(array, array.get_capacity(), comparator);
}

我在main中调用它的地方:

template <typename T>
bool custom_comparator(T a, T b)
{ 
  return a < b;
}

1 个答案:

答案 0 :(得分:0)

具体问题在于:

template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
  class array<T>::p_comparator_func comparator)
{
  insertion_sort_recursive(array, array.get_capacity(), comparator);
}

我应该使用class而不是typename,如这篇不错的文章所述,有关typename here

因此固定版本为:

template <typename T>
void wrap_insertion_sort_recursive(class array<T> &array,
  typename array<T>::p_comparator_func comparator)
{
  insertion_sort_recursive(array, array.get_capacity(), comparator);
}