C++ 将基于范围的用于std::set<;标准::唯一性\u ptr<;T>&燃气轮机;删除函数
我试图将基于范围的迭代器与一组C++ 将基于范围的用于std::set<;标准::唯一性\u ptr<;T>&燃气轮机;删除函数,c++,c++11,set,unique-ptr,deleted-functions,C++,C++11,Set,Unique Ptr,Deleted Functions,我试图将基于范围的迭代器与一组unique\ptr实例一起使用,但我得到了以下编译错误: C2280: 'std::unique_ptr<Component,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function C22
unique\ptr
实例一起使用,但我得到了以下编译错误:
C2280: 'std::unique_ptr<Component,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
C2280:'std::unique\u ptr::unique\u ptr(const std::unique\u ptr&'):尝试引用已删除的函数
代码的基本内容如下:
#include <set>
#include <memory>
std::set<std::unique_ptr<Component>>* m_components;
class Component
{
void DoSomething(){};
};
void ProcessComponents()
{
for (auto componentsIterator : *m_components)
{
componentsIterator->DoSomething();
componentsIterator++;
}
}
#包括
#包括
std::set*m_组件;
类组件
{
void DoSomething(){};
};
void ProcessComponents()
{
适用于(自动元件定位器:*m_元件)
{
成分测定器->剂量测定法();
componentsIterator++;
}
}
你知道为什么这会成为一个问题,或者如何解决它吗
for (auto componentsIterator : *m_components)
auto
扩展为std::unique\u ptr
,这意味着您正试图获取每个元素的副本。瞧,这个循环实际上是:
for(auto it=m_components->begin(); it!=m_components->end(); ++it)
{
std::unique_ptr<Component> componentsIterator=*it;
componentsIterator->DoSomething();
componentsIterator++;
}
for(自动it=m_组件->开始();it!=m_组件->结束();+it)
{
std::unique_ptr componentsIterator=*it;
成分测定器->剂量测定法();
componentsIterator++;
}
如您所见,您正在调用std::unique_ptr
copy构造函数,但是unique_ptr
的copy构造函数被删除(因为它违反了unique_ptr
语义)
使用auto&
获取参考
(顺便说一句,
componentsIterator
没有合适的名称,因为它不是迭代器,而是实际的元素)感谢您的即时响应。这很有帮助,但并没有让我完全理解,因为我仍然在增量运算符C2676上遇到了一个错误:二进制“++”:“const std::unique_ptr”没有定义此运算符或到预定义运算符可接受的类型的转换operator@jhegedus:您打算如何处理该++
unique\u ptr
没有定义任何++
操作符,它是您的组件
类的东西还是您将它放在那里以移动到循环中的下一个元素?我想我需要++来迭代循环。我误解了吗?@杰格德斯:是的,你误解了;基于范围的for
已经解决了这个问题。事实上,我发现我误解了,这是在为你扩展为为我。再次感谢std::set*
——很可能集本身不需要是指针。另外,奇怪的是,您使用智能指针来保存集合
中的元素,但决定手动管理集合
的内存。@Praetorian,集合实际上是在析构函数中创建和销毁类时初始化的类的成员。我试图用一个简单的例子来说明我的问题。这似乎是正确的方法,但我是一个初学者,所以请告诉我是否有更好的方法。std::set m_components
是更好的方法。它将与您的类实例一起实例化和销毁,不再需要new
和delete
它了。太棒了!谢谢你的提示。我第一次在这里发帖。刚刚创建了一个帐户,我已经对它的响应速度和价值感到惊讶。