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::copy
与 std::map
一起使用,太复杂以至于无法工作它使旧 VS 编译器的错误消息变得神秘。备选方案:
y.insert(x.begin(), x.end());
如果失败,您应该会收到更明确的错误消息。
我找不到在 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::copy
与 std::map
一起使用,太复杂以至于无法工作它使旧 VS 编译器的错误消息变得神秘。备选方案:
y.insert(x.begin(), x.end());
如果失败,您应该会收到更明确的错误消息。