由std :: map派生的类中的std :: map迭代器导致的内存错误

时间:2019-06-07 08:50:12

标签: c++ dictionary templates std

我要从std :: map派生一个类,因为我想为此数据结构创建自己的方法。我遇到“ mySelect”问题,如果元素不存在,则应返回nullptr,否则返回unique_ptr。

我尝试在声明迭代器之前指定typename关键字,但无济于事。

template <class KeyType, class ValueType>
class Container : public std::map<KeyType, ValueType> {

    public:
        std::unique_ptr<ValueType> mySelect(KeyType key) {
        typename map<KeyType, ValueType>::iterator value;
            if ((value = this->find(key)) == this->end())
            return nullptr;
        return std::make_unique<ValueType>(value);
        }
}

我收到此错误:

Error   C2664   'std::vector<std::shared_ptr<Transaction>,std::allocator<_Ty>>::vector(const std::vector<_Ty,std::allocator<_Ty>> &)': cannot convert argument 1 from 'std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>' to 'const _Alloc &'

1 个答案:

答案 0 :(得分:0)

首先,此代码:

 return std::make_unique<ValueType>(value);

在逻辑上等于:

std::unique_ptr<ValueType> tmp = new Value(value);
return tmp;

(虽然不一样,所以您不应只是为了使您理解而替换另一个)。因此,您尝试创建类Value的新实例,并从迭代器对其进行初始化。除非Value提供这种构造函数,否则这将无法工作。如果要复制并通过所有权转让将其退还,则将代码更改为:

 return std::make_unique<ValueType>(value->second);

但我不确定这是您要执行的操作。如果要返回指向现有对象的指针,则不能在此处使用std::unique_ptr,因为它提供了唯一的所有权(带有名称),您需要在地图中存储std::shared_ptr而不是按值存储对象,并且返回它的副本,或者简单地返回原始指针。

  

如何使mySelect()的调用者成为返回对象的所有者?

就像我说过的那样,您用std::shared_ptr存储对象并与该方法的调用者共享所有权,或者您最初将对象存储为std::unique_ptr,但随后必须将其移出,就像您的{{ 1}}将无法再拥有该对象。