std :: map给出类型转换错误,但仅当针对x86编译时

时间:2019-01-15 15:37:29

标签: c++ c++11 x86 stdmap

使用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限定符引起的。如果将其删除,则我对这两种体系结构都没有问题。

1 个答案:

答案 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);

解决了错误!