Вставка карты приводит к ошибке C2664 в VS 2015, работает в VS 2013

Этот фрагмент кода отлично работал в 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
]

Я попытался написать const перед объектом Vector3dLite, но, видимо, синтаксис неверен.

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

1

Решение

Поскольку тип значения для карты имеет константный объект в качестве первого элемента (ключ карты), вы обычно не можете использовать 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 &,

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector