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

Har*_*rry 5 c++ gcc-extensions

#pragma pack(push,1)有人能告诉我和之间的区别__attribute__((packed))吗?如果我使用第二种类型的结构打包,我会收到编译错误

\n\n
\n
cannot bind packed field \xe2\x80\x98ABC.abc::a\xe2\x80\x99 to \xe2\x80\x98unsigned int&\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

但如果我使用第一种类型的结构打包,则不会出现编译错误。

\n\n

这是我的示例代码:

\n\n
//DataStructure.h\n\n#ifndef DATASTRUCTURE_H_\n#define DATASTRUCTURE_H_\n\nstruct abc\n{\n    unsigned int a;\n    float b;\n}__attribute__((packed));\n\n#endif /* DATASTRUCTURE_H_ */\n\n\n\n//Main.cpp\n#include<iostream>\n#include<map>\n#include "DataStructure.h"\n\n\nint main()\n{\n    struct abc ABC;\n    ABC.a=3;\n    ABC.b=4.6f;\n\n    std::map<unsigned int,struct abc> Mapp;\n    Mapp.insert(std::make_pair(ABC.a,ABC));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

YSC*_*YSC 5

错误来自:

std::make_pair(ABC.a,ABC);
Run Code Online (Sandbox Code Playgroud)

自 C++11 起,make_pair定义为:

template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );
Run Code Online (Sandbox Code Playgroud)

因此,将其ABC.a作为第一个参数试图将左值引用绑定到位字段(打包结构基本上是什么),这是非法的

要解决这个问题,您必须创建一个新的unsigned int 并make_pair使用它进行调用:

unsigned int a = ABC.a;
Mapp.insert(std::make_pair(a,ABC));
Run Code Online (Sandbox Code Playgroud)