在(错误?)的印象boost::container::flat_set
中std::set
,我认为元素set
的flat_set
数量很少,并且搜索性能比插入更关键。
在稍后的阶段,我被一个令人困惑的编译错误难住了,我最终将其追溯到flat_set
作为类成员的使用。
例如:
class Room {
private:
boost::container::flat_set<int> v;
};
以下代码不会编译,但如果我替换flat_set
为std::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 没有已知的转换
我的问题是:
- 这个错误是预期的吗?如果是,那么我该如何解决呢?
- 示例代码中的三个语句有何不同,为什么只有最后一个语句失败?
- 为什么编译器抱怨
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;
};