作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 2 个类:Child
派生自 Parent
:
#include <stdint.h>
#include <iostream>
using namespace std;
class Parent
{
public:
int parentMember;
};
class Child : public Parent
{
};
现在,我有一个用于自定义实现动态数组的类模板(跳过不必要的部分)
template <typename T>
class DArray
{
private:
T* m_array;
int32_t m_length;
public:
// Default constructor
DArray() : m_array{ nullptr }, m_length{ 0 } {
};
// Search returns index of the first found item or -1 if not found, comparison is done
// using function pointer, which should return boolean
int32_t Search(const T& data, bool(*comparisonFunction)(T, T)) {
for (int32_t i = 0; i < m_length; i++) {
if (comparisonFunction(m_array[i], data))
return i;
}
return -1;
}
};
我有一个比较函数,用于查明我的动态数组是否已经包含具有相同 parentMember
值的元素
bool comparisonFunction(Parent* n1, Parent* n2) {
return (n1->parentMember == n2->parentMember);
}
最后,我有我的动态数组,它应该包含指向 Child
对象的指针。
int main()
{
DArray<Child*> dArray;
Child *c;
dArray.Search(c, comparisonFunction);
return 0;
}
此代码在此行返回错误:
dArray.Search(c, comparisonFunction);
错误是:
argument of type "bool (*)(Parent *n1, Parent *n2)" is incompatible with
parameter of type "bool (*)(Child *, Child *)"
我的问题是:为什么编译器不隐式地将 Child*
转换为 Parent*
,就像我将 Child*
作为将 Parent*
作为参数的函数的参数?
有没有办法在不为每个子类实现新的比较函数的情况下解决这个问题?
最佳答案
在指向函数类型的指针之间没有隐式转换。
我会将您的 Search
函数更改为可以采用任何仿函数类型(包括 lambda、std::function
等)的模板函数。
template <typename F>
int32_t Search(const T& data, const F& comparisonFunction) {
for (int32_t i = 0; i < m_length; i++) {
if (comparisonFunction(m_array[i], data))
return i;
}
return -1;
}
关于c++ - C++ 中函数指针的隐式类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747137/
我是一名优秀的程序员,十分优秀!