Har*_*rry 5 c++ gcc-extensions
#pragma pack(push,1)有人能告诉我和之间的区别__attribute__((packed))吗?如果我使用第二种类型的结构打包,我会收到编译错误
\n\n\nRun Code Online (Sandbox Code Playgroud)\ncannot bind packed field \xe2\x80\x98ABC.abc::a\xe2\x80\x99 to \xe2\x80\x98unsigned int&\xe2\x80\x99\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}\nRun Code Online (Sandbox Code Playgroud)\n
错误来自:
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)