2013-01-10 60 views
2

我試圖編譯的Visual Studio 2008在下面的代碼PICE:的boost ::容器和錯誤: 「C2679:二進制 '=':沒有操作員發現」

struct test 
{ 
    boost::container::vector<int> v1; 
}; 
test v1, v3; 
const test & v2 = v3; 
v1 = v2; 

我的錯誤得到的是:
錯誤C2679:二進制「=」:沒有操作員發現它採用類型「const的測試」的右邊的操作數(或沒有可接受的轉化率)
可以是「測試&測試::運算= (test &)' while試圖匹配參數列表'(test,const test)'

當使用正常的std :: vector而不是boost :: container等價物時,代碼編譯。我正在尋找爲什麼這個代碼不能編譯以及如何編譯的答案。

+2

FWIW,下面的代碼編譯MSVC10下的:#include <升壓/容器/ vector.hpp> 結構測試 { 升壓::容器::矢量 V1; }; () \t test v1,v3; \t const test&v2 = v3; \t v1 = v2; } –

+1

另一個FWIW:使用'-std = gnu ++ 03'的GCC 4.7.2以類似於VC++ 2008的方式失敗。它使用'-std = gnu ++ 11'編譯得很好,但是再次,整個點(boost :: container :: vector正在使用這個引起的問題)的提升移動庫的目的是爲C++ 03實現提供移動語義,因此使用a語言編譯時沒有任何問題也不足爲奇。編譯器/編譯器模式支持C++ 11移動語義。看起來好像可能存在一個處理可複製const對象的boost處理中的錯誤。 –

回答

3

我發現,已經被問過類似的問題: boost::container::vector fails to compile with C++03 compiler

看來,我們所觀察的行爲旨在與已知提升社區:在班 Boost::move emulation limitations章「賦值運算得出來自或持有可複製和移動類型「。

爲了使主要問題中顯示的代碼正常工作,必須使用BOOST_COPYABLE_AND_MOVABLE宏將類聲明爲可複製和可移動的類。此外,複製分配的const版本需要明確定義。 C++ 03編譯器的代碼更正版本:

class test 
{ 
private: 
    BOOST_COPYABLE_AND_MOVABLE(test); 
public: 
    test& operator=(BOOST_COPY_ASSIGN_REF(test) p) // Copy assignment 
    { 
     v1 = p.v1; 
     return *this; 
    } 
    boost::container::vector<int> v1; 
}; 

那些額外的類裝飾可能確實變得煩人,特別是當代碼庫很大時。通過代碼爬行和添加賦值運算符不是我想花費時間的事情。

+0

我希望像這樣的問題/答案得到更多的關注/ upvotes。比平常更有趣。 –

相關問題