Я пишу этот небольшой шаблонный класс, наследующий от интерфейса.
Внутри моего класса я объявил переменную, которую хотел бы использовать снаружи, и поместил ее в таблицу диспетчеризации.
когда я пытаюсь скомпилировать мою программу, она выдает ошибку
Это мой исходный код:
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) {...}
}
Я пытался решить эту проблему по-разному, но никто не работает. Как я мог это исправить? Заранее спасибо 🙂
Есть ряд вещей, которые вызывают ошибку при компиляции Вашего кода.
Прежде всего это конструкция Operand::castInt8
не имеет смысла компилятору как Operand
это не класс / структура, а шаблон класса. Чтобы получить указатель на функцию Вам нужен конкретный тип, а не его шаблон. Поэтому что-то вроде этого было бы более разумным Operand<int>::castInt8
например.
Тип bool castInt8(void)
не является bool (*)(void)
как это кажется. Нестатические функции-члены имеют более сложные типы. В вашем случае это будет bool (Operand<sometype>::*)(void)
,
И последнее — компилятор не знает 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},
};
Других решений пока нет …