回调问题错误:非静态数据成员的使用无效
Posted
技术标签:
【中文标题】回调问题错误:非静态数据成员的使用无效【英文标题】:Callback issues error: invalid use of non-static data member 【发布时间】:2018-11-19 23:10:59 【问题描述】:编辑:更新干净的可重现示例。
我是 C++ 的初学者,有几年的 C 经验,所以如果我以错误的方式处理这个问题,我深表歉意。我试图将问题分解为尽可能小的代码示例。在我的代码中,我继承了一个 C 回调函数,在其中我想从类成员触发另一个回调。
我有两个问题:
a) 我在 Callback
中没有 Range
的实例,并且回调没有 void * 参数供我使用。
b) 我收到一条错误消息
错误:非静态数据成员“Range::cbk”的使用无效
我刚刚开始学习 C++ 和 OOP 的规则,如果我做的事情存在根本性的缺陷,我深表歉意。
#include <iostream>
#include <functional>
class Range
public:
typedef std::function<void()> TCallback;
TCallback cbk;
Range()
cbk = std::bind(&Range::RunTest, this);
void Close()
~Range() Close();
void RunTest()
std::cout << "RunningTest\n";
;
static void Callback(bool ev)
if (ev)
Range::cbk();
int main()
std::function<void(bool)> test;
Range r1;
test = std::bind(Callback, 1);
test(1);
return 0;
【问题讨论】:
你的minimal reproducible example在哪里? 请提供minimal reproducible example。目前,很难理解您的问题可能是什么。您尝试调用方法的问题是静态方法吗?如果您从TestOne
之外调用它,它会被标记为private
,并且是非静态的。
@LightnessRacesinOrbit 已更新以将问题分解为尽可能小的示例。
@AlgirdasPreidžius 已更新以将问题分解为尽可能小的示例
不清楚你在问什么或你想做什么。
【参考方案1】:
没有实例就不能调用成员函数。
你在 Range
构造函数中做对了;你在main
和Callback
做错了。
static void Callback(Range* ptr, bool ev)
if (ev)
ptr->cbk();
还有:
test = std::bind(Callback, &r1, 1);
// ^^^^^
如果你不能改变Callback
,那么你想做的事情根本不可能。你必须有一些 global Range
指针,但这真的很重要。归根结底,这就是发明类的原因,但如果您因为卡在一个非常扁平的 C API 中而无法使用它们,那么您只需要像在 C 中一样破解它。
【讨论】:
非常感谢您的意见;是的,这正是我无法更改回调声明的问题。即使我需要一个用于多个实例的全局指针数组,我也可能会沿着全局指针路线走下去。如此丑陋,这似乎是我唯一的选择。 @tech1990 差不多。顺便说一句,回调设计得很糟糕,因为知道这总是一个问题,人们倾向于至少在其中粘贴void*
以传递信息。以上是关于回调问题错误:非静态数据成员的使用无效的主要内容,如果未能解决你的问题,请参考以下文章
| 9 |错误:无效使用非静态数据成员'Matrix :: row'| 9 |错误:数组绑定不是']'令牌之前的整数常量|
使用boost bind时无效使用非静态成员函数 - c ++