Error: "cannot bind packed field" while inserting data into std::map using insert function
Error: "cannot bind packed field" while inserting data into std::map using insert function
谁能告诉我 #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));
}
错误来自:
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));
您无需手动复印。您可以使用一元加运算符强制求值,这会将 ABC.a
提升为整数值:
Mapp.insert(std::make_pair(+ABC.a, ABC));
谁能告诉我 #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));
}
错误来自:
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));
您无需手动复印。您可以使用一元加运算符强制求值,这会将 ABC.a
提升为整数值:
Mapp.insert(std::make_pair(+ABC.a, ABC));