Ошибка: "невозможно связать упакованное поле" при вставке данных в std::map с помощью функции вставки
Может кто-нибудь сказать мне разницу между #pragma pack(push,1)
а также __attribute__((packed))
? Я получаю ошибку компиляции, если я использую второй тип упаковки структуры, который говорит
cannot bind packed field ‘ABC.abc::a’ to ‘unsigned int&’
Но если я использую первый тип упаковки структуры, то нет ошибки компиляции.
Это мой пример кода:
//DataStructure.h
#ifndef DATASTRUCTURE_H_
#define DATASTRUCTURE_H_
struct abc
{
unsigned int a;
float b;
}__attribute__((packed));
#endif /* DATASTRUCTURE_H_ */
//Main.cpp
#include<iostream>
#include<map>
#include "DataStructure.h"
int main()
{
struct abc ABC;
ABC.a=3;
ABC.b=4.6f;
std::map<unsigned int,struct abc> Mapp;
Mapp.insert(std::make_pair(ABC.a,ABC));
}
2 ответа
Ошибка происходит от:
std::make_pair(ABC.a,ABC);
Начиная с C++11, make_pair
определяется как:
template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );
так что давай ABC.a
в качестве первого аргумента пытается привязать ссылку lvalue к битовому полю (что в основном представляет собой упакованная структура), что недопустимо.
Чтобы решить эту проблему, вы должны создать свежий неподписанный int и вызвать make_pair
с этим:
unsigned int a = ABC.a;
Mapp.insert(std::make_pair(a,ABC));
Вам не нужно делать копию вручную. Вы можете использовать унарный оператор плюс для принудительной оценки, что будет способствовать
ABC.a
до целочисленного значения:
Mapp.insert(std::make_pair(+ABC.a, ABC));