地图插入导致 VS 2015 中的 C2664 错误,适用于 VS 2013
Map insert results in C2664 error in VS 2015, works in VS 2013
这段代码在 VS 2013 中运行完美,但我不得不更新到 VS 2015,现在它抛出错误。
我确实阅读了 https://msdn.microsoft.com/en-us/library/s5b150wd.aspx 并在谷歌上搜索了很多,但我仍然不知道如何解决这个问题。
我正在使用 eigen 数学库来做一些 3d 数学的东西。 Eigen 的 Vector3d class 不能用作容器的键,所以我创建了自己的 Vector3dLite class 来解决这个问题。
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));
由于映射的值类型将 const 对象作为第一个元素(映射键),您通常不能使用 make_pair
来构造值,因为推断类型不是常量。
您可以创建具有显式类型的对:
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 &
.
获取其参数
这段代码在 VS 2013 中运行完美,但我不得不更新到 VS 2015,现在它抛出错误。
我确实阅读了 https://msdn.microsoft.com/en-us/library/s5b150wd.aspx 并在谷歌上搜索了很多,但我仍然不知道如何解决这个问题。
我正在使用 eigen 数学库来做一些 3d 数学的东西。 Eigen 的 Vector3d class 不能用作容器的键,所以我创建了自己的 Vector3dLite class 来解决这个问题。
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));
由于映射的值类型将 const 对象作为第一个元素(映射键),您通常不能使用 make_pair
来构造值,因为推断类型不是常量。
您可以创建具有显式类型的对:
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 &
.