Используя Visual Studio 2017, у меня есть раздел кода, в котором я определяю std :: map, который прекрасно компилируется в x64, но возвращает ошибку при компиляции для x86.
Соответствующая карта указывает на перечисление и возвращает структуру со строкой дескриптора и некоторыми указателями на функции.
Я просмотрел настройки своего проекта и подтвердил, что единственная разница в настройках компилятора C ++ между ними - флаг архитектуры. Я думаю, что это как-то связано с указателями на функции в каждой записи карты, так как у меня есть другие std :: maps в этом же файле, содержащие структуры строк и удваивающие / плавающие числа, которые все отлично работают.
Конкретная ошибка: C2440: Невозможно преобразовать из типа 1 в тип2 , с текстом невозможно преобразовать из «списка инициализаторов» в std::map<int,PropertyMetaData, std::less<_Kty>, std::allocator<std::pair<const _Kty,_Ty>>>
EDIT:
Я сделал самый компактный пример без внешних зависимостей. Я не получаю ошибок в 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. Если это будет удалено, у меня нет проблем с любой из этих архитектур.