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) 与构造函数冲突的主要内容,如果未能解决你的问题,请参考以下文章

C++--继承中的构造与析构父子间的冲突

Java构造函数

简化代码,提高效率:C++ auto关键字的魅力

为啥这个 const auto 变量在 range-for 循环中为类的 const 成员函数编译?

Objective-C类的构造函数和析构函数

深入了解C++:auto与函数模板之推导规则辨析