VS 2012 error C2679: binary '=': 没有发现操作员在做 std::copy 的地图

VS 2012 error C2679: binary '=' : no operator found doing std::copy of map

我找不到在 VS 2012 中编译以下简单 stl 代码的方法:

#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)

更新

真的很抱歉!我设法隔离了有问题的代码,就是这样。它基本上是智能指针 shared_ptr 的类型逆变问题,因为即使 anAPtr 实际上指向 AImpl 实例的包装器,它也无法复制 anAImplPtr = anAPtr

#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()));
}

不要使用 避免将 std::copystd::map 一起使用,太复杂以至于无法工作它使旧 VS 编译器的错误消息变得神秘。备选方案:

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

如果失败,您应该会收到更明确的错误消息。