powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Templates
7 сообщений из 7, страница 1 из 1
Templates
    #39682173
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые программисты у меня вопрос

вот скажем есть структура классов

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<class Color>
class AbstractCar {
}

class BMW : AbstractCar<Black> {

}

class Porshe : AbstractCar<White> {

}


std::vector<AbstractCar> cars;

BMW car1;
Porshe car2;

cars.emplace_back(car1);
cars.emplace_back(car2);



С++ ругается ?

Могу ли я так оперировать с шаблонами и вектором ?

Спасибо.

[modИсправленная версия.[/mod]

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
template <class Color>
class AbstractCar {
};

class BMW : AbstractCar<Black> {
};

class Porshe : AbstractCar<White> {
};


std::vector<AbstractCar> cars; 

BMW car1;
Porshe car2;

cars.emplace_back(car1);
cars.emplace_back(car2);
...
Рейтинг: 0 / 0
Templates
    #39682174
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
template <class Color>
class AbstractCar {
}
...
Рейтинг: 0 / 0
Templates
    #39682178
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semen
Могу ли я так оперировать с шаблонами и вектором ?

Спасибо.
Нет. Даже если бы это и не было бы шаблоном, запихивание базового класса по значению в вектор вело бы к object slicing'у.
Заведи базовый нешаблонный базовый (абстрактный) класс для AbstractCar и храни его указатели в векторе.
...
Рейтинг: 0 / 0
Templates
    #39682179
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Заведи базовый нешаблонный базовый (абстрактный) класс для AbstractCar и храни его указатели в векторе.


А с шаблонным так нельзя ?
...
Рейтинг: 0 / 0
Templates
    #39682183
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenА с шаблонным так нельзя ?
Нет, потому что, формально, шаблон типом не является. Вектору нужен тип, который в нём будет храниться, как минимум, для вычисления его размера.
Шаблонный класс становится типом только при его инстанциации конкретными шаблонными параметрами.
...
Рейтинг: 0 / 0
Templates
    #39682188
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно

Спасибо
...
Рейтинг: 0 / 0
Templates
    #39683783
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
template <class Color>
class AbstractCar {
};

class BMW : AbstractCar<Black> {
};

class Porshe : AbstractCar<White> {
};


std::vector<AbstractCar> cars;   
// срезка тут не даст возможность хранения в одном контейнере значений разных типов, полиморфно.
// чтобы это сделать, надо хранить по ссылке, в виде указателя. Только тогда полиморфный тип можно будет хранить.

BMW car1;
Porshe car2;

cars.emplace_back(car1);
cars.emplace_back(car2);



Можно использовать
std::vector < std::unique_ptr<Car> > или
std::vector < std::shared_ptr<Car> >

Кроме этого, шаблонный AbstractCar также делает это дело невалидным.
Типы
class BMW : AbstractCar<Black>
class Porshe : AbstractCar<White>
несоотносимы друг с другом, у них нет общего предка.
Потому что
AbstractCar<Black> и AbstractCar<White> -- разные типы данных , никак несоотносимые друг с другом классы.

Поэтому от шаблона в базовом классе также нужно избавляться.
Но к счастью шаблон тут как раз не нужен ни на фиг, AbstractCar нужно сделать нешаблонным классом, а цвет -- просто его мембером (свойством) и задавать его например в конструкторе.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Templates
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]