VS 2012错误C2679:二进制'=':没有操作员发现做std :: map的map

时间:2016-11-30 13:57:15

标签: c++ visual-studio-2012

我找不到在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的类型逆转问题,因为即使anAImplPtr = anAPtr实际指向anAPtr实例的包装,它也无法复制AImpl:< / p>

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

1 个答案:

答案 0 :(得分:1)

不要使用避免使用std::copy std::map太复杂而不能使其工作它会使错误信息变得模糊旧VS编译器。替代方法:

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

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