我找不到在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()));
}
答案 0 :(得分:1)
不要使用避免使用std::copy
std::map
,太复杂而不能使其工作它会使错误信息变得模糊旧VS编译器。替代方法:
y.insert(x.begin(), x.end());
如果失败,您应该收到更明确的错误消息。