【问题标题】:for(auto e : xxx) conflict with constructorfor(auto e : xxx) 与构造函数冲突
【发布时间】: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 ())吗?

标签: c++ qt c++11


【解决方案1】:

没有理由将explicit 放在这里。 explicit 的工作是防止隐式转换,但你不转换 - 你只是复制。去掉它。只有具有与类类型本身不同类型的参数的单参数构造函数才需要它。

无论如何,C++ 中通常的习惯用法是获取引用(除非您明确需要副本),这也适用于基于范围的 for 循环:

for(auto const& e : config.zone.values())
  // do whatever with 'e'

【讨论】:

    【解决方案2】:

    您需要从复制构造函数中删除显式。或者您可以通过引用传递您的自动值...

    for (auto &value : container) ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多