4

在(错误?)的印象boost::container::flat_setstd::set,我认为元素setflat_set数量很少,并且搜索性能比插入更关键。

在稍后的阶段,我被一个令人困惑的编译错误难住了,我最终将其追溯到flat_set作为类成员的使用。

例如:

class Room {
  private:
    boost::container::flat_set<int> v;
};

以下代码不会编译,但如果我替换flat_setstd::set.

Room a;
Room b = Room(); // Example 1. Compiles OK
a = b;           // Example 2. Compiles OK
a = Room();      // Example 3. Eeeek! Compile fails on this line

我看到的编译错误是:

错误:'a = Room()' 中的 'operator=' 不匹配
注:候选人是:
注意:Room&Room::operator=(Room&)
注意:从 'Room' 到 'Room&' 的参数 1 没有已知的转换

我的问题是:

  1. 这个错误是预期的吗?如果是,那么我该如何解决呢?
  2. 示例代码中的三个语句有何不同,为什么只有最后一个语句失败?
  3. 为什么编译器抱怨Room而不是赋值运算符flat_set?的使用是否flat_set影响了为类生成的默认运算符?

完整的示例程序:

#include <boost/container/flat_set.hpp>

class Room {
  private:
    boost::container::flat_set<int> v;
};

int main(int argc, char *argv[]) {
  Room a;

  Room b = Room();
  a = b;
  a = Room();  // compilation fails here

  return 0;
};
4

2 回答 2

3

这是Boost.Move执行的移动模拟的已知限制。您可以在此处找到有关它的更多信息:http: //www.boost.org/doc/libs/1_52_0/doc/html/move/emulation_limitations.html#move.emulation_limitations.assignment_operator

于 2012-11-13T16:24:07.057 回答
1

免责声明:我是 OP;我已经接受了K-ballo 的回答,因为它导致了最终的解决方案,我发布这个来补充这个线程的一些细节。

正如在接受的答案中提到的,这确实是使用BOOST_COPYABLE_AND_MOVABLE 宏的类的已知限制(它适用于包括and中的许多类)。boost::containerflat_setflat_map

为了克服这个问题,我为类定义了一个赋值运算符,它接受一个 const 引用参数。例如,在问题中的示例Room类的情况下,它将沿着以下行:

class Room {
  private:
    boost::container::flat_set<int> v;

  public:
    Room& operator=(const Room& source) {
      v = source.v;
      return *this;
    }
};
于 2012-12-14T16:22:32.860 回答