为了理解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 << "4444\n";
}
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, "Dillon\n");
我对这个问题需要什么知识?谢谢!
编辑:根据@ denis-bu和@TheOne的回答,我可以添加两个陈述:typedef struct func *fptr;
private:
mutable fptr fn;
public:
callback(fptr fn) : fn(fn) {std::cout << "1111\n";}
但我不知道这样的c ++机制或c ++用于查找或知道调用此构造函数的规则:
callback(fptr fn) : fn(fn) {std::cout << "1111\n";}
答案 0 :(得分:1)
一种脑筋急转弯。
我的猜测是callback<void>
没有接受callback<void>::func*
的构造函数。
因此,您应该将cb0
的类型更改为callback<void>::func*
,或将构造函数添加到接受callback
的{{1}}。这取决于你打算做什么...... :)
答案 1 :(得分:0)
根据@ denis-bu和@TheOne的回答,我可以添加两个陈述:
typedef struct func *fptr;
private:
mutable fptr fn;
public:
callback(fptr fn) : fn(fn) {std::cout << "1111\n";}
但我不知道这样的c ++机制或c ++用于查找或知道调用此构造函数的规则:
callback(fptr fn) : fn(fn) {std::cout << "1111\n";}