使用Visual Studio 2017,我有一段代码定义了一个std :: map,它可以在x64上很好地编译,但是在为x86编译时返回错误。
有问题的映射键在枚举上,并返回带有描述符字符串和一些函数指针的结构。
我检查了项目设置,并确认两者之间唯一的C ++编译器设置差异是体系结构标志。我最好的猜测是,它与每个映射条目中的函数指针有关,因为我在同一文件中还有其他std :: maps,其中包含字符串和double / float的结构都可以正常工作。
抛出的特定错误是C2440:无法从类型1转换为类型2 ,且文本不能从“初始化列表”转换为std::map<int,PropertyMetaData, std::less<_Kty>, std::allocator<std::pair<const _Kty,_Ty>>>
< / p>
我做了一个最紧凑的示例,没有任何外部依赖。在x64中没有任何错误,但在设置为x86时却出现了类型转换错误:
#include <map>
typedef double(*convertFunc)(int, int, double);
typedef int(*convertFuncD)(int, int, double*,double*,int);
extern "C" {
__declspec(dllexport) double __stdcall Pressure(
int inUnits,
int outUnits,
double inValue
);
__declspec(dllexport) int __stdcall PressureD(
int inUnits,
int outUnits,
double* inValue,
double* outValue,
int n
);
}
//Metadata for each Property
struct PropertyMetaData {
const char desc[20]; //Text description
const convertFunc func; //double conversion function
const convertFuncD funcArrayD; //array double conversion function
};
// Map containing all of the properties and their metadata
typedef std::map<int, PropertyMetaData> PropertiesMap;
const PropertiesMap conversions = {
//Mapping The type of unit (mass, distance, etc.) to the appropriate function
//Enumeration {desc[20], func, arrayfuncD, arrayFuncF }
{ 1, {"Pressure", Pressure, PressureD}},
};
经过更多实验后,它似乎是由__stdcall限定符引起的。如果将其删除,则我对这两种体系结构都没有问题。
答案 0 :(得分:1)
知道了!问题是在函数声明中包含__stdcall
,或者在函数指针类型定义中省略了__stdcall
。似乎对于某些体系结构组合,如果__stdcall
不在指针类型定义中,则__stdcall
可能会或可能不会导致类型转换错误。声明我的函数指针类型如下:
typedef double(__stdcall *convertFunc)(EUnits, EUnits, double);
typedef int(__stdcall *convertFuncD)(EUnits, EUnits, double*,double*,int);
typedef int(__stdcall *convertFuncF)(EUnits, EUnits, float*, float*, int);
解决了错误!