提问人:Sami 提问时间:3/20/2023 最后编辑:Sami 更新时间:3/20/2023 访问量:322
shared_ptr std::d ynamic_pointer_cast 失败,并显示“尝试引用已删除的函数”错误
shared_ptr std::dynamic_pointer_cast fails with "attempting to reference a deleted function" error
问:
我已经在 StackOverflow 中看到了关于这个类似错误的所有帖子,但仍然找不到导致我出现问题的原因。
我正在使用将对象强制转换为对象,但遇到“尝试引用已删除的函数”错误。我已经确保析构函数是虚拟的,但错误仍然存在。std::dynamic_pointer_cast
std::shared_ptr<Base>
std::shared_ptr<DerivedShared>
Base
是什么原因导致了此错误,我该如何解决?标准库中是否有任何可能导致此问题的已知限制或错误?任何见解或建议将不胜感激。
PS : 我知道它适用于,但想知道是什么导致了dynamic_pointer_cast
的问题!static_pointer_cast
struct Base
{
Base() = default;
virtual ~Base() = default;
//Copy
Base(const Base&) = default;
Base& operator=(const Base&) = default;
//Move
Base(Base&&) = default;
Base& operator=(Base&&) = default;
};
struct DerivedShared : public Base
{
public:
DerivedShared() //: data(std::shared_ptr<int[]>(new int[3]{1,2,3}))
{
//data = std::make_shared<int[]>(new int[3]{ 1,2,3 });
data = std::shared_ptr<int[]>(new int[3]{ 1,2,3 });
}
public:
std::shared_ptr<int[]> data;
};
int main()
{
std::cout << "----------------------------------------\n";
std::shared_ptr<Base> base5 = std::make_shared<DerivedShared>();
for (size_t i = 0; i < 3; ++i)
{
std::cout << std::dynamic_pointer_cast<DerivedShared>(base5)->data[i] << '\n';
}
}
答:
8赞
user17732522
3/20/2023
#1
您禁用了 RTTI,在这种情况下,Microsoft 的标准库实现定义为已删除,因为没有 RTTI 就无法工作。(见 https://github.com/microsoft/STL/blob/main/stl/inc/memory#L2049。std::dynamic_pointer_cast
dynamic_cast
)
如果要使用 ,则无法禁用 RTTI。std::dynamic_pointer_cast
评论
#else
dynamic_cast
dynamic_cast
typeid