我很难理解这个问题。假设我有以下向量:
std::vector<std::shared_ptr<Car>> cars;
Car是一个抽象类。我想能够返回不同类型的弱指针,所以我按照以下方式操作。
template<typename T>
std::weak_ptr<T> GetCar()
{
for (std::vector<std::shared_ptr<Car>>::iterator it = cars.begin(); it != cars.end(); ++it)
{
T* derived = dynamic_cast<T*>((*it).get());
if (derived != nullptr)
{
std::weak_ptr<T> carPointer = *it;
return carPointer;
}
}
return std::weak_ptr<T>();
}
当我尝试使用从Car继承的类来使用该函数时,会出现以下错误:
Error C2440 'initializing': cannot convert from 'std::shared_ptr<Car>' to 'std::weak_ptr<Saab>'
在请求车辆时可能没有有效的汽车。 我尝试使用boost :: optional,但它无法处理多态性。 如果我无法使其工作,我可能会使用裸指针。
shared_ptr
和weak_ptr
所指向的类型必须相同。我会分三步完成:首先返回一个weak_ptr<Car>
,然后将其转换为shared_ptr<Car>
,最后再转换为T*
。 - Mark Ransomweak_ptr
转换为shared_ptr
的目的是在你使用它时保持对象的存活状态;将shared_ptr
放入一个临时变量中会破坏这个目的。 - Mark Ransomstd::weak_ptr<T> carPointer = std::shared_ptr<T>(*it);
这段代码能够正常工作吗? - user253751