错误:使用插入功能将数据插入std :: map时出现“无法绑定打包字段”

时间:2018-11-26 12:58:14

标签: c++ gcc-extensions

有人可以告诉我#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 :(得分:1)

错误来自:

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作为第一个参数尝试是将左值引用绑定到位字段(基本上是打包结构)which is illegal

要解决这个问题,必须创建一个 fresh unsigned int并使用它调用make_pair

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