@badproger12years

Поможете найти ошибку в коде?

вот код
#include <iostream>
#include<typeinfo>
using namespace std;
template<class T1 >
class TypeSize
{
public:

    TypeSize(T1 val)
	{
		cout << "constructor typesize" << endl;
		this->value = val;
	}
	void DataSize()
	{
		cout << "value " << sizeof(value) << endl;
	}
	TypeSize()
	{
		this->value = NULL;
	}
protected:
	T1 value;
};
template<class T1 >
class Type : public virtual TypeSize<T1>
{
public:
	Type(T1 value) : TypeSize(value)
	{
		this->value = value;
	}
	Type() : TypeSize()
	{
		this->value = 0;
	}
	void Rer(T1 value)
	{
		cout << value << endl;
	}
	void Show()
	{
		cout << "Название типа " <<typeid(this->value).name()<< endl;
	}
};

int main()
{
	setlocale(LC_ALL, "Rus");
	int v = 1;
		Type<int>j(v);
		j.DataSize();
		j.Show();
		j.Rer(v);

}

пишет что Type недопустимая иницилизация члена:
TypeSize не является базовым классом либо членом.

Хотя на самом деле TypeSize базовый класс от которого и наследуется метод DataSize()
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Если смотреть по код сверху вниз.

Первая ошибка:
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()
{
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы