Использование метода класса шаблона вне класса в таблице диспетчеризации

Я пишу этот небольшой шаблонный класс, наследующий от интерфейса.
Внутри моего класса я объявил переменную, которую хотел бы использовать снаружи, и поместил ее в таблицу диспетчеризации.
когда я пытаюсь скомпилировать мою программу, она выдает ошибку

Это мой исходный код:

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

Я пытался решить эту проблему по-разному, но никто не работает. Как я мог это исправить? Заранее спасибо 🙂

0

Решение

Есть ряд вещей, которые вызывают ошибку при компиляции Вашего кода.

  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},
};
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]