c++ - 成员函数接受模板函数指针的问题
问题描述
我正在尝试在我的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);
}
我的自定义比较器:
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>);
解决方案
问题具体在于:
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);
}
推荐阅读
- java - 在这种情况下如何使用 java-util-scanner 输入新行字符串?
- c# - 如何在 lambda 函数中订购标准 SQS 事件消息
- javascript - Phaser3 仅在全屏时具有不同的缩放行为
- swiftui - SwiftUI Picker Item 多行
- google-apps-script - 在 Google Apps 脚本中对行进行分组和折叠
- jquery - 如何在浏览器上发送 ajax POST?
- html - 如何在 FlexLayout 中使用百分比
- windows - 是否有任何 powershell 命令来计算日志文件中一行中的 id 数?
- svelte - 在 svelte-filepond 中,如何将参数传递给插件?
- python-3.x - 如何更改有色日志级别?