std :: map выдает ошибку преобразования типа, но только при компиляции для x86 - PullRequest
0 голосов
/ 15 января 2019

Используя 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. Если это будет удалено, у меня нет проблем с любой из этих архитектур.

1 Ответ

0 голосов
/ 15 января 2019

Понял! Проблема заключалась в том, что в объявление функции было включено __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);

исправил ошибку!

...