首页 > 解决方案 > 成员函数接受模板函数指针的问题

问题描述

我正在尝试在我的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 ‘&lt;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);
}

我的自定义比较器:

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

我在主要调用它的地方:

class array<int> a(5);
a[0] = 8;
a[1] = 6;
a[2] = 7;
a[3] = 1;
a[4] = 3;

std::cout << "attempting sort" << std::endl;
a.sort(wrap_insertion_sort_recursive<int>, custom_comparator<int>);

标签: c++

解决方案


问题具体在于:

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

所以固定版本是:

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);
}

推荐阅读