在调度表的类外使用模板类方法

时间:2018-07-13 10:54:59

标签: c++ class templates dispatch-table

我正在编写从接口继承的这个小型模板类。 在我的类内部,我声明了一个我想在外部使用的变量,并将其放入调度表中。 当我尝试编译程序时,会抛出错误

这是我的源代码:

template <typename T> class Operand;
typedef struct  s_typeInfo
{
    int     enum_nb;
    bool    (*fct_cast)(void);
}               t_typeInfo;


t_typeInfo typeInfo[] =
{
    {0, Operand::castInt8},
};

template <typename T>
class Operand : public IOperand {
    ...
    bool    castInt8(void) {...}
}

我一直试图以许多不同的方式来解决这个问题,但是没有一个人能起作用。我该如何解决?预先谢谢你:)

1 个答案:

答案 0 :(得分:3)

有很多事情会导致您的代码编译出错。

  1. 首先,这种构造Operand::castInt8对编译器没有意义,因为Operand不是类/结构,而是类模板。获得指向函数的指针您需要一个具体的类型而不是它的模板。因此,例如Operand<int>::castInt8这样的事情会更合理。

  2. bool castInt8(void)的类型似乎不是bool (*)(void)。非静态成员函数具有更复杂的类型。在您的情况下为bool (Operand<sometype>::*)(void)

  3. 最后一件事-编译器不知道Operand模板在定义之前具有成员castInt8。因此,您应该像这样重新排序:

    template <typename T>
    class Operand : public IOperand {
        ...
        bool    castInt8(void) {...}
    }
    
    t_typeInfo typeInfo[] =
    {
        {0, &Operand<sometype>::castInt8},
    };
    

将所有内容放在一起看起来像这样:

template <typename T> class Operand;

typedef struct  s_typeInfo
{
    int     enum_nb;
    bool    (Operand<int>::*fct_cast)(void);
}               t_typeInfo;


template <typename T>
class Operand {
    public:
    bool    castInt8(void) {}
};


t_typeInfo typeInfo[] =
{
    {0, &Operand<int>::castInt8},
};