使用g ++ 4.8.3时,从'callback <void> :: func *'转换为非标量类型'callback <void>'请求错误?</void> </void>

时间:2014-10-17 12:00:39

标签: c++ stl

为了理解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";}

2 个答案:

答案 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";}