2012-11-13 34 views
4

在(false?)的印象下,boost::container::flat_setstd::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&’ 

我的問題是:

  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; 
}; 
+0

該錯誤消息是關於賦值運算符,而不是拷貝構造。不是那回答這個問題...... –

+0

謝謝皮特。更新。 –

+0

[SSCCE](http://sscce.org)會有幫助。 –

回答

3

這是通過Boost.Move進行移動仿真的已知限制。你可以在這裏找到更多關於它的信息:http://www.boost.org/doc/libs/1_52_0/doc/html/move/emulation_limitations.html#move.emulation_limitations.assignment_operator

+0

非常感謝。這絕對是相關的,但我仍然在努力瞭解其含義並找到解決方案。 –

+0

@Shawn Chin:只需爲'Room'定義一個_assignemnt operator_,它需要_const reference_ argument。 –

+0

請原諒我的無知。我嘗試過定義'Room&Room :: operator =(const Room&x){...}'但這並沒有改變任何東西。我顯然是做錯了。 –

1

聲明:我是OP;我已經接受K-ballo's answer,因爲它導致了最終的解決方案,我發佈這個補充這個線程的一些細節。

作爲公認的答案提到的,這確實是使用該BOOST_COPYABLE_AND_MOVABLE macro(適用於許多類的boost::container包括flat_setflat_map)班known limitation

爲了克服這個問題,我定義了一個賦予const引用參數的類的賦值操作符。例如,在樣品Room類的在quesiton的情況下這將是沿着線:

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

    public: 
    Room& operator=(const Room& source) { 
     v = source.v; 
     return *this; 
    } 
};