Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将基于范围的用于std::set<;标准::唯一性\u ptr<;T>&燃气轮机;删除函数_C++_C++11_Set_Unique Ptr_Deleted Functions - Fatal编程技术网

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
它了。太棒了!谢谢你的提示。我第一次在这里发帖。刚刚创建了一个帐户,我已经对它的响应速度和价值感到惊讶。