Downcast до шаблонного класса - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть шаблонный класс, и я хотел иметь вектор этого класса.Я видел решение, в котором вам нужно обернуть класс другим классом без шаблона, а затем получить вектор этого нового класса.Теперь я хочу понизить, например, один из объектов списка, но приведение не разрешено.Что мне делать?

Пример:

class Wrapper
{
}

template <typename T>
class Father : public Wrapper
{
}

int main()
{
    std::vector<std::shared_ptr<Wrapper>> objects;
    Father<int> object = (Father<int>)objects.at(0); // ERROR (lets say i know its integer)
}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вам не нужно переносить класс шаблона, чтобы иметь возможность создавать вектор с его типом.

Это будет прекрасно работать

std::vector<std::shared_ptr<Father<int>>> objects;
std::shared_ptr<Father<int>> object = objects.at(0);
0 голосов
/ 06 февраля 2019

objects[0] является указателем на объект.Ваше приведение (кстати, никогда не использует приведение в стиле C) пытается преобразовать объект shared_ptr<Wrapper> в объект Father<int>.Конечно, это невозможно, так как эти два типа совершенно не связаны.

Разыменуйте указатель и уменьшите его до ссылки (если вы хотите полиморфизм):

auto& object = static_cast<Father<int>&>(*objects[0]);
...