0

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

这是我的源代码:

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) {...}
}

我一直在尝试以多种不同的方式解决这个问题,但没有一种方法能奏效。我该如何解决?先感谢您 :)

4

1 回答 1

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},
};
于 2018-07-13T11:15:57.033 回答