gpt4 book ai didi

c++ - C++ 中函数指针的隐式类型转换?

转载 作者:太空狗 更新时间:2023-10-29 20:35:50 26 4
gpt4 key购买 nike

我有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com