提问人:karanbanthia 提问时间:8/13/2023 更新时间:8/13/2023 访问量:50
模板类的非静态成员函数使用无效
Invalid use of non-static member function of a template class
问:
尝试从模板类分配回调函数时出现以下错误。我正在访问对象上的回调函数和回调赋值函数。我无法制作回调函数,因为它需要访问指向 Buffer 对象的非静态指针。我该如何实现这项工作?static
下面是代码。这可以在 https://www.onlinegdb.com/ 上执行
main.cpp: In function ‘int main()’:
main.cpp:62:37: error: invalid use of non-static member function ‘void Class1::Callback() [with T = unsigned char]’
62 | pBuffer->SetWrCallback(pClass1->Callback);
| ~~~~~~~~~^~~~~~~~
main.cpp:43:10: note: declared here
43 | void Callback()
| ^~~~~~~~
#include <iostream>
using namespace std;
using CallbackAfterWrite = void (*)(void);
template<typename T>
class Buffer
{
public:
Buffer() {}
~Buffer() {}
std::size_t size()
{
return 10;
}
void SetWrCallback(CallbackAfterWrite wrCallback)
{
mWrCallback = wrCallback;
}
private:
CallbackAfterWrite mWrCallback;
};
template<typename T>
class Class1
{
public:
Class1() {}
~Class1() {}
void Callback()
{
if(0 != mpBuffer->size())
{
std::cout<< "Trigger callback" <<endl;
}
}
private:
Buffer<T> *mpBuffer;
};
int main()
{
cout<<"Hello World"<<endl;
Buffer<uint8_t>* pBuffer = new Buffer<uint8_t>;
Class1<uint8_t>* pClass1 = new Class1<uint8_t>;
pBuffer->SetWrCallback(pClass1->Callback);
return 0;
}
如果回调函数是并且不需要访问非静态私有数据成员,这将起作用,但不幸的是,我无法摆脱它。static
答: 暂无答案
评论
CallbackAfterWrite
是指向自由函数的指针,而不是 .此外,should be 也清楚地表明,您也需要存储指向实例的指针,以便知道在执行回调时应该使用哪个对象。请说明您也想如何使用。void (Class1<T>::*)(void)
pBuffer->SetWrCallback(pClass1->Callback);
pBuffer->SetWrCallback(&Class1<uint8_t>::Callback);
Class1<T>
mWrCallback
Buffer
Class1
mWrCallback