我要从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 &'
答案 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}}将无法再拥有该对象。