2016-11-30 50 views
0

我不能找到一種方法,使編譯下面簡單的STL代碼在VS 2012:VS 2012錯誤C2679:二進制「=」:沒有操作員發現正在做的std ::地圖的副本

#include <algorithm> 
#include <map> 
#include <string> 

... 
class SomeClass; 
SomeClass a; 
std::map<std::string, SomeClass> x; 
x["a"] = a; 
std::map<std::string, SomeClass> y; 
std::copy(x.begin(), x.end(), std::inserter(y, y.end())); 

我總是得到VS編譯器錯誤:

xutility(2089): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::pair<_Ty1,_Ty2>' (or there is no acceptable conversion) 

UPDATE

我真的很抱歉!我設法隔離有問題的代碼,就是這樣。它基本上是智能指針的類型逆變問題shared_ptr,因爲它無法複製anAImplPtr = anAPtr即使anAPtr實際上指向一個AImpl實例的包裝:

#include <algorithm> 
#include <map> 
#include <string> 
#include <iterator> 
    #include <boost/thread.hpp> 

class A 
{  
    public: 
    virtual ~A() { } 
}; 

class AImpl : public A { 
    public: 
    virtual ~AImpl() { } 
}; 

typedef boost::shared_ptr<A> APtr; 
typedef boost::shared_ptr<AImpl> AImplPtr; 

static void test() 
{ 
    std::map<std::string, APtr> x; 
    APtr a(new AImpl()); 
    x["a"] = a; 
    std::map<std::string, AImplPtr> y; 
    std::copy(x.begin(), x.end(), std::inserter(y, y.end())); 
} 
+0

它適用於MSVC2015,如果包含'#include ',會發生什麼? –

+0

根據[這個問題的答案](http://stackoverflow.com/questions/2748295/how-can-i-copy-one-map-into-another-using-stdcopy)應該工作。 – Borgleader

+0

對不起,這個例子的作品,但似乎問題是在實際SomeClass –

回答

1

不要使用std::copy避免std::map方式太複雜,無法使其工作它使舊VS編譯器的錯誤信息變得模糊。替代方案:

y.insert(x.begin(), x.end()); 

如果失敗,則應該得到更明確的錯誤消息。

+0

好的建議,但不是一個真正的答案。在我們真正回答這個問題之前,OP需要提供一個mcve。 – NathanOliver

+0

@NathanOliver你是對的,我在等着這個mcve來更新我的答案。 – YSC

相關問題