Вот я убрал шаблоны. Что изменилось?
class TaskWithoutPayload
{
MainClass main_field;
};
class TaskWithPayload : public TaskWithoutPayload
{
PayloadClass payload;
};
видимо ничего не изменилось. это ж просто минимальный пример для демонстрации проблемы. Я изначально не хотел делать наследование т.к. думал там сразу появится указатель на вирт таблицу. Вот получившийся боевой фулл:
#ifndef _BG_TASK_H_
#define _BG_TASK_H_
#include <cstdint>
#include <string>
#include "ToStringTemplate.h"
template <typename IdClass>
class BgTask
{
private:
IdClass id;
uint32_t seconds_since_epoch; // 4 bytes
uint8_t parents_done_num; // 1 byte
public:
BgTask() : seconds_since_epoch(0), parents_done_num(0){}; // for unordered_map
BgTask(const IdClass & id_) : id(id_), seconds_since_epoch(0), parents_done_num(0){};
~BgTask(){};
IdClass GetId() const { return id; };
std::string GetIdAsStr(){ return to_string(id); };
uint8_t GetParentsDoneCounter() const { return parents_done_num; };
void SetParentsDoneCounterTo1(){ parents_done_num = 1; };
void IncrementParentsDoneCounter(){ parents_done_num++; };
uint32_t GetSeconds() const { return seconds_since_epoch; };
void SetSeconds(uint32_t seconds){ seconds_since_epoch = seconds; };
};
template<typename IdClass, typename PayloadClass>
class BgTaskWithPayload : public BgTask<IdClass>
{
public:
PayloadClass payload;
};
#endif // _BG_TASK_H_