<void><void>使用 g++ 4.8.3 时从"回调::func*"转换为非标量类型"回调"请求错误?
Conversion from ‘callback<void>::func*’ to non-scalar type ‘callback<void>’ requested error when using g++ 4.8.3?
为了理解c++的模板和函数对象,我想创建一个模板类回调,它是一种近似函数currying的类型。类型为callback<R, B1>
的对象包含成员R operator() (B1)
。因此,回调是函数对象,第一个模板类型指定函数的返回,其余参数指定传递函数的参数类型。SFS使用了这种方法。但当我使用以下代码创建一个实例并编译它时,我得到了一个错误:
template<typename R, typename F1 = void> class callback;
template<typename R>
class callback<R>{
public:
struct func {
virtual R operator()() = 0;
};
typedef struct func *fptr;
public:
template<typename B1> struct pfunc_0_1 : public func{
typedef R(*fp_t)(B1);
fp_t fp;
B1 b1;
pfunc_0_1(fp_t fp, const B1& b1) : fp(fp), b1(b1) {
cout << "4444n";
}
R operator() () {
return fp(b1);
}
};
template<typename B1, typename B1x>
static func* init( R(*fp)(B1), const B1x& b1){
return new pfunc_0_1<B1>(fp, b1);
}
};//class callback
我在编译时出错:
forstack.cc:26:65: error: conversion from ‘callback<void>::func*’
to non-scalar type callback<void>’ requested
callback<void> cb0 = callback<void>::init(printmsg, "Dillonn");
这个问题我需要什么知识?谢谢
编辑:根据@denis bu和@TheOne的回答,我可以添加两个语句:
typedef struct func *fptr;
private:
mutable fptr fn;
public:
callback(fptr fn) : fn(fn) {std::cout << "1111n";}
但我不知道c++的机制,也不知道c++用来找到或知道调用这个构造函数的规则是什么:
callback(fptr fn) : fn(fn) {std::cout << "1111n";}
有点像脑筋急转弯。
我的猜测是callback<void>
没有接受callback<void>::func*
的构造函数。
因此,您应该将cb0
的类型更改为callback<void>::func*
,或者向接受callback<R>::func*
的callback
添加构造函数。这取决于你打算做什么…:)
根据@denis-bu和@TheOne的回答,我可以添加两个语句:
typedef struct func *fptr;
private:
mutable fptr fn;
public:
callback(fptr fn) : fn(fn) {std::cout << "1111n";}
但我不知道c++的机制,也不知道c++用来找到或知道调用这个构造函数的规则是什么:
callback(fptr fn) : fn(fn) {std::cout << "1111n";}
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- 将任意数据传递给不接受"void* userarg"的C++回调
- 使用 void 函数作为回调,从 "std::function<void ()>?
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- sqlite3 更改函数回调参数 void* not用于 int* C++
- 如何在 c++ 结构中的 void* 变量中调用存储函数(回调)
- 是否应删除回调传递的void*指针
- <void><void>使用 g++ 4.8.3 时从"回调::func*"转换为非标量类型"回调"请求错误?
- 作为(void*)传递给回调函数的继承类
- 我如何用在这个回调中具有编译时类型检查的东西替换void指针?
- 鼠标回调函数中void*转换为int*** (opencvc++)