gpt4 book ai didi

c++ - 尝试执行 shared_ptr swap() 时出现奇怪错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:13 25 4
gpt4 key购买 nike

我是一个相对的 C++ 新手,试图将一个现有项目从原始指针转换为使用 C++11 的 shared_ptr .总的来说进展非常顺利,我认为我理解如何shared_ptr在移动语义、右值引用等方面工作。好东西。

但是,我遇到了一个奇怪的错误,我不明白也不知道如何修复。先介绍一点背景。我有一个根植于名为 EidosValue 的抽象基类的类层次结构, 和一个名为 EidosValue_Int_vector 的类是(间接地)一个具体的子类:

class EidosValue
class EidosValue_Int : public EidosValue
class EidosValue_Int_vector : public EidosValue_Int

我的代码一般在EidosValue中进行流量,但有时,尤其是在创建新值时,我需要处理特定的子类。

我已经为 shared_ptr 做了类型定义s 用于这些类(class),所以我有:

typedef std::shared_ptr<EidosValue> EidosValue_SP;
typedef std::shared_ptr<EidosValue_Int_vector> EidosValue_Int_vector_SP;

等等。好的,现在进入问题的核心。我有一个返回 EidosValue_SP 的函数它创造的。根据函数内的逻辑,它可能会创建 EidosValue 的几个不同的具体子类之一。 .所以我做了这样的事情:

EidosValue_SP MyClass::MyMethod(...)
{
EidosValue_SP result;

if (...)
{
EidosValue_Int_vector_SP int_result_SP = make_shared<EidosValue_Int_vector>();
... do subclass-specific stuff with int_result_SP...
result.swap(int_result_SP);
}
else (...)
{
...similar logic for other subclasses...
}

...other shared logic...
return result;
}

问题出在 swap()称呼。我得到一个错误:“Non-const lvalue reference to type 'shared_ptr<EidosValue>' cannot bind to a value of unrelated type 'shared_ptr<EidosValue_Int_vector>'”。这令人费解,因为 EidosValue_Int_vector不是“无关类型”,它是 EidosValue 的公共(public)子类,这里的代码知道这一点。如果我输入 result = make_shared<EidosValue_Int_vector>();编译器对此没有任何问题,因此它清楚地知道这些类型是相关且兼容的。它只是不喜欢它在 swap() 的上下文中因为某些原因。在我项目的其他地方,我可以简单地执行 return int_result_SP; ,声明的返回类型为 EidosValue_SP,并且工作正常——编译器很乐意将 EidosValue_Int_vector_SP 视为该上下文中的 EidosValue_SP——但我不能在这里这样做,因为函数底部的共享逻辑.

我在这里的实现中有些受限,因为这段代码是一个瓶颈,需要快速运行(是的,我从实际检测代码中知道这一点,是的,它确实很重要)。所以必须使用 make_shared为了避免双重分配,我也强烈希望在我从 int_result_SP 传递指针时避免引用计数递增/递减。导致;我不希望有两个 shared_ptr 指向新实例的时刻。所以swap()似乎是显而易见的方法;但我被这个编译器错误阻止了。为什么会这样,我该如何解决?谢谢!

附录:

哦,进一步思考我打赌我知道为什么会发生错误。 swap()不反对把 EidosValue_Int_vector进入EidosValue_SP ,但它确实在放置 EidosValue 时有问题进入EidosValue_Int_vector_SP ;在那个方向上,类型不兼容。自从 result 之后我就没有这样想过没有任何值(value)(即我猜 nullptr );但当然swap()不知道。好的,如果那是问题所在,那么问题仍然存在:我如何在保持代码快速的同时实现传输——不执行 refcount inc/dec 并且不放弃使用 make_shared ?既然我理解了这个问题(我认为),似乎有一些 API 或技巧被我忽略了......

最佳答案

您不能交换,因为尽管EidosValue_Int_vector 是一个 EidosValue,但反之则不然。

关于c++ - 尝试执行 shared_ptr swap() 时出现奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32745034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com