地图插入导致VS 2015中的C2664错误,适用于VS 2013

时间:2016-09-08 17:07:50

标签: c++ c2664

这段代码在VS 2013中完美运行,但我不得不更新到VS 2015,现在它会抛出错误。

我确实阅读了https://msdn.microsoft.com/en-us/library/s5b150wd.aspx并搜索了相当多的内容,但我仍然不知道如何解决这个问题。

我使用特征数学库来做一些3d数学的东西。 Eigen的Vector3d类不能用作容器的键,所以我创建了自己的Vector3dLite类来解决这个问题。

class Vector3dLite
{
public:
float VertX, VertY,VertZ;
Vector3dLite(Vector3d& InputVert)
{
    VertX = static_cast<float>(InputVert.x());
    VertY = static_cast<float>(InputVert.y());
    VertZ = static_cast<float>(InputVert.z());
}

Vector3dLite(Vector3dLite& InputVert)
{
    VertX = InputVert.VertX;
    VertY = InputVert.VertY;
    VertZ = InputVert.VertZ;
}
//more operator overloading stuff below
}

编译器抛出错误的地方

map<Vector3dLite, int>  VertexIds;
int unique_vertid = 0;
VertexIds.insert(make_pair(Vector3dLite(tri.Vert1), unique_vertid)); //This line
// Vert1 is an eigen Vector3d object
//...

这是编译器错误:

error C2664: cannot convert argument 1 from 'std::pair<Vector3dLite,int>' to 'std::pair<const _Kty,_Ty> &&'
      with
      [
          _Kty=Vector3dLite,
          _Ty=int,
          _Pr=std::less<Vector3dLite>,
          _Alloc=std::allocator<std::pair<const Vector3dLite,int>>
      ]
      and
      [
          _Kty=Vector3dLite,
          _Ty=int
      ]

我确实尝试在Vector3dLite对象之前编写const,但显然语法不正确。

VertexIds.insert(make_pair(const Vector3dLite(tri.Vert1),unique_vertid));

1 个答案:

答案 0 :(得分:2)

由于map的值类型将const对象作为第一个元素(map键),因此通常不能使用make_pair来构造值,因为推断的类型不是const。

您可以使用显式类型创建一对:

std::pair<const Vector3dLite, int>(Vector3dLite(tri.Vert1), unique_vertid)

您可以使用地图的类型

std::map<Vector3dLite, int>::value_type(Vector3dLite(tri.Vert1), unique_vertid)

或者你可以创建一个名为const的对象来使用make_pair

const Vector3dLite mapkey(tri.Vert1);
make_pair(mapkey, unique_vertid);

另一个注意事项:您的构造函数应该使用const &

的参数