Если смотреть по код сверху вниз.
Первая ошибка:
this->value = NULL;
В общем смысле ты не можешь знать, каким типом параметризуют твой шаблон. Но делая присвоение
NULL
ты надеешься на то что это будет указатель. Далее по тексту ты сам же свою надежду и разбиваешь, инстанцируя свой шаблон от типа
int
.
Если тебе надо присвоить переменной значение по умолчанию - используй конструктор по умолчанию.
Например так.
this->value = T1(); // Или this->value = T1{}; для C++11 и выше.
this
в этом месте, кстати, можно смело опустить.
Вторая ошибка:
Type(T1 value) : TypeSize(value)
// ...
Type() : TypeSize()
Для обращения к сущностям родительского шаблона нужно писать полную квалификацию имени сущности.
Type(T1 value) : TypeSize<T1>::TypeSize(value)
// ...
Type() : TypeSize<T1>::TypeSize()
Если заменить все
this->value
на
value
, то компилятор снова скажет про обращение к несуществующему полю. Но если к
value
обращаться используя его полную квалификацию
TypeSize<T1>::value
, код соберется должным образом.
Третья ошибка:
Type(T1 value) : TypeSize(value)
{
this->value = value;
}
Type() : TypeSize()
{
this->value = 0;
}
Ты и инициализацию родительского класса производишь, и значение меняешь. Это избыточно. Инициализацию
value
из этих конструкторов лучше убрать и предоставить все права по инициализации своих полей типу
TypeSize
. Плюс, конструктор по умолчанию у тебя снова надеется на простой тривиальный тип. Присвоение нулю приведет к ошибке компиляции уже при инстанцировании для тривиального составного типа.
Лучше так:
Type(T1 value) : TypeSize<T1>::TypeSize(value)
{
}
Type() : TypeSize<T1>::TypeSize()
{
}