Существует множество вещей, которые вызывают erroer с компиляцией вашего кода.
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},
};
В вашей функции function
вы присваиваете адрес локальной переменной вашей структуре. После возвращения из function
этот адрес больше не действителен. Вы можете сделать это static
или распределить его динамически.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct s
{
char *value;
} S;
S list[2];
void function( )
{
char val1[] = "val1";
char val2[] = "val2";
//Note that you are creating a copy of "val1" here which can be avoided by changing it to char *val1 = "val1";
list[0].value = malloc(strlen(val1)+1); //allocate space for val1 + NUL-terminator
strcpy(list[0].value, val1); //copy string
list[1].value = malloc(strlen(val2)+1);
strcpy(list[1].value, val2);
//You could also use the function strdup which allocates memory and duplicates the string
//list[0].value = strdup(val1);
printf("%s\n", list[1].value); //prints val2
}
int main(int argc, char** argv)
{
function();
printf("%s", list[1].value);
free(list[0].value); //Don't forget to free.
free(list[1].value);
return 0;
}