回调函数:参数不兼容
Callback function: Incompatible argument
我试图在问题中使用回调函数,但遇到了一些麻烦。在sort()
函数中,参数&compareType
有一个错误:
类型为"bool(Person::*)(const Person&p1,const Person&p2)"的参数与类型为"compare"`的参数不兼容
人.h
class Person
{
public:
bool compareType(const Person& p1, const Person& p2) { return ... };
void sort()
{
...
list->addInOrder(person, &compareType);
...
}
...
}
dlinkdlist.h
typedef bool (*compare)(const Person& p1, const Person&p2);
class dlinkedlist
{
public:
void addInOrder(const Person& person, compare comparefunc)
{
Person person2;
...
comparefunc(person, person2);
...
}
}
bool compareType(const Person& p1, const Person& p2)
实际上是类型
bool (Person::*) (const Person&, const Person&)
您必须使您的方法static
具有正确的类型。
主要有三种解决方案。
您可以:
- 将成员方法声明为
static
- 在类的
friend
之外定义一个函数(如果需要)并使用它
第三种解决方案可能是最有趣的:
- 您可以使用非捕获lambda函数,因为它是非捕获函数,所以可以衰减为指向函数的指针
因此,作为一个例子,以下lambda在您的情况下是完全正确的:
[](const Person& p1, const Person& p2) { return true; }
它遵循一个最小的工作示例:
struct A { };
using Fn = bool(*)(const A &, const A &);
void f(Fn fn) {
fn(A{}, A{});
};
int main() {
f([](const A &, const A &){ return true; });
};
正如您所看到的,lambda会自动衰减为指向函数的指针,因此在这种情况下使用它是很好的
显然,如果您需要访问私有成员,那么涉及lambda的解决方案是不合适的。
非静态方法不同于自由函数或静态方法。您可以从错误消息中的类型中看到:
bool (Person::*)(const Person& p1, const Person& p2)
这与简单功能的类型不同
bool (*)(const Person& p1, const Person& p2)
(直观地说,非静态方法必须以某种方式获得this
指针,因此编译器在调用它时必须做一些不同的事情)。
注意,你的compareType
无论如何都不应该是非静态成员——你必须像一样称它
personA.compareType(personB, personC)
这没有多大意义。
要么让它成为一个静态方法(这样你就不会在Person的实例上调用它)
class Person {
public:
static bool compareType(const Person&, const Person&);
// ...
};
或者只是让它成为一个免费功能
bool comparePeople(const Person&, const Person&);
非静态类方法隐式添加了对此的引用,因此您的函数实际上看起来像
bool compareType(Person *this, const Person &p1, const Person &p2);
您应该将其声明为静态,这将不会传递到。
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- C++ 类型 "char" 的参数与类型 "const char" 的参数不兼容
- Qt C++:静态断言失败:信号和插槽参数不兼容
- 类型 "const char *" 的参数与类型 "char *" 的参数不兼容
- 如何警告 C 中 void 指针上的参数不兼容的类型
- 类型 "const char*" 的参数与类型 "char*" 的参数不兼容。但是为什么?:(
- 类型 "const char*" 的参数与类型 "Person" 的参数不兼容
- 类型 "const char *" 的参数与类型 "LPCWSTR" 的参数不兼容
- 是否可以安全地引用具有与模板不兼容的模板参数的C++模板类型?
- 创建进程使用路径时出现错误事件:类型 "char *" 的 E0167 参数与类型 "LPWSTR" 的参数不兼容
- 类型为“const [structname] *”的参数与类型为“const [structname] *”的参数不兼容
- 类型 "const char *" 的默认参数与类型 "char *" 的参数不兼容
- 类型 "const char *" 的参数与 "LPSTR" C++ 类型的参数不兼容
- C++中的C代码不兼容参数错误