bha*_*ler 5 c++ swap shared-ptr make-shared c++11
我是一个相对的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
Run Code Online (Sandbox Code Playgroud)
我的代码通常是流量EidosValue,但有时,特别是在创建新值时,我需要处理特定的子类.
我shared_ptr为这些类做了s的typedef ,所以我有:
typedef std::shared_ptr<EidosValue> EidosValue_SP;
typedef std::shared_ptr<EidosValue_Int_vector> EidosValue_Int_vector_SP;
Run Code Online (Sandbox Code Playgroud)
等等.好的,所以现在问题的核心.我有一个函数返回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;
}
Run Code Online (Sandbox Code Playgroud)
问题出在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的公共子类,这里的代码知道它.如果我输入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_ptrs指向新实例时,我不希望有时间.所以swap()看起来似乎是显而易见的方式; 但我被这个编译器错误阻止了.为什么会发生这种情况?我该如何解决?谢谢!
附录:
哦,进一步思考这个我打赌我知道为什么错误发生了. swap()不反对把EidosValue_Int_vector进入EidosValue_SP,但它确实有把问题EidosValue进入EidosValue_Int_vector_SP; 在那个方向上,类型不兼容.我没有这么想过,因为result它没有价值(即nullptr,我猜); 但当然swap()不知道.好的,所以如果这就是问题,那么问题仍然存在:如何在保持代码快速的同时实现传输 - 不执行refcount inc/dec并且不再使用make_shared?现在我理解了这个问题(我认为),似乎有一些我忽略的API或技巧......
你不能swap因为,虽然EidosValue_Int_vector 是 EidosValue反过来是不正确的.
| 归档时间: |
|
| 查看次数: |
376 次 |
| 最近记录: |