在(false?)的印象下,boost::container::flat_set
是std::set
的替代替換,我用flat_set
替換,無論我希望元素的數量是多少,搜索性能比插入更重要。錯誤複製對象,當類包含boost :: container :: flat_set
在稍後階段,我被一個令人困惑的編譯錯誤難住,我最終追溯到使用flat_set
作爲類成員。
例如:
class Room {
private:
boost::container::flat_set<int> v;
};
下面的代碼將無法編譯,但是如果我std::set
取代flat_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
的編譯錯誤我看到的是:
error: no match for ‘operator=’ in ‘a = Room()’ note: candidate is: note: Room& Room::operator=(Room&) note: no known conversion for argument 1 from ‘Room’ to ‘Room&’
我的問題是:
- 這個錯誤是正常嗎?如果是這樣,那麼我該如何解決它?
- 示例代碼中的三條語句如何不同?爲什麼只有最後一條語句失敗?
- 爲什麼編譯器會抱怨
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;
};
該錯誤消息是關於賦值運算符,而不是拷貝構造。不是那回答這個問題...... –
謝謝皮特。更新。 –
[SSCCE](http://sscce.org)會有幫助。 –