<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?

本文关键字:回调 void lt gt 标量 类型 错误 请求 转换 时从 g++      更新时间:2023-10-16

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