for(auto e : xxx) 与构造函数冲突
Posted
技术标签:
【中文标题】for(auto e : xxx) 与构造函数冲突【英文标题】:for(auto e : xxx) conflict with constructor 【发布时间】:2012-11-07 17:37:37 【问题描述】:我定义了一个类“eventZone”,它在我的类“配置”中使用
class configuration ... QMap<QString, eventZone> zones ...
直到最近我成功地使用了像锯这样的 for 循环
for(eventZone evz : config.zone.values()) ...
但是这不起作用,因为我为 eventZone 实现了一个复制构造函数(需要对其进行序列化并能够保存配置)
我得到的错误是
/home/.../zonedisplay.cpp:43: erreur : no matching function for call to 'eventZone::eventZone(eventZone&)'
我的新构造函数有类型:
explicit eventZone(const eventZone &cpy);
如何让两者共存?
【问题讨论】:
我怀疑问题在于显式的使用,在这种情况下似乎没有必要。 你知道你可以使用for (const EventZone& e : config.zone.values ())
,甚至for (const auto& e : config.zone.values ())
吗?
【参考方案1】:
没有理由将explicit
放在这里。 explicit
的工作是防止隐式转换,但你不转换 - 你只是复制。去掉它。只有具有与类类型本身不同类型的参数的单参数构造函数才需要它。
无论如何,C++ 中通常的习惯用法是获取引用(除非您明确需要副本),这也适用于基于范围的 for 循环:
for(auto const& e : config.zone.values())
// do whatever with 'e'
【讨论】:
【参考方案2】:您需要从复制构造函数中删除显式。或者您可以通过引用传递您的自动值...
for (auto &value : container) ...
【讨论】:
以上是关于for(auto e : xxx) 与构造函数冲突的主要内容,如果未能解决你的问题,请参考以下文章