Ошибка: «невозможно связать упакованное поле» при вставке данных в std :: map с помощью функции вставки - PullRequest
0 голосов
/ 26 ноября 2018

Может кто-нибудь сказать мне разницу между #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));
}

1 Ответ

0 голосов
/ 26 ноября 2018

Ошибка исходит из:

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 к битовому полю (что в основном представляет собой упакованная структура), , что недопустимо .

Чтобы решить это, выдолжен создать fresh unsigned int и вызвать make_pair с ним:

unsigned int a = ABC.a;
Mapp.insert(std::make_pair(a,ABC));
...