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