Функция шаблона не распознается - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь написать набор функций, которые преобразуют строки в соответствующие им числовые значения "int, float, double ...", но моя шаблонная функция не распознается компилятором c ++.
Когда я вызываю его, я получаю сообщение «Нет подходящей функции для вызова. Я возвращал функцию типа T из этой функции, но у меня было это сообщение об ошибке, я попытался изменить функцию, чтобы она могла изменить значение переменной, переданной по ссылке, но ошибка сохраняется.
Я пытался изменить эту функцию, но она по-прежнему не работает, пожалуйста, помогите. У меня есть несколько версий этой функции, которые переопределены, следующим образом:

static void convertValue(eOperandType type, const std::string &value, FloatOperandType typeDeterminer, T &container)
    {
        try
        {
            container = std::stof(value);
        }
        catch (std::invalid_argument e)
        {
            throw AVMException("The value passed as number is not valid");
        }
        catch (std::out_of_range e)
        {
            char *msg = "The value passed is out of the range of the typed passed";
            throw AVMException(msg);
        }
        catch (exception& e)
        {
            throw AVMException("An unexpected error occured when converting value types");
        }
    }
template <typename T>
    static void convertValue(eOperandType type, const std::string &value, IntOperandType typeDeterminer, T &container)
    {
        int val = 0;

        try
        {
            val = std::stoi(value);
            switch(type)
            {
                case eOperandType::Int8:
                    if(val < -128 || val > 127)
                        throw AVMWarnException("Overflow for type Int8");
                case eOperandType::Int16:
                    if(val < -32768 || val > 32,767)
                        throw AVMWarnException("Overflow for type Int16");
                case eOperandType::Int32:
                    if(val < -2147483648 || val > 2147483647)
                        throw AVMWarnException("Overflow for type Int32");
            }

            container = std::stoi(value);
        }
        catch (std::invalid_argument e)
        {
            throw AVMException("The value passed as number is not valid");
        }
        catch (std::out_of_range e)
        {
            char *msg = "The value passed is out of the range of the typed passed";
            throw AVMException(msg);
        }
        catch (exception& e)
        {
            throw AVMException("An unexpected error occured when converting value types");
        }
    }

Вот как я вызываю функцию:

 int v = 0;
 Converter::convertValue<int>("20", eOperandType::Int8, IntOperandType::_Int8, &v);

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Если я рискну предположить, что eOperandType является типом перечисления, то имеет смысл, что вы не можете конвертировать "20" в него.Кроме того, вы передаете int*, где ожидается int&.Обратите внимание на сигнатуру вашей функции:

template <typename T>
void convertValue(eOperandType, const std::string&, IntOperandType, T&)

и сравните это с тем, как вы вызываете функцию:

convertValue<int>("20", eOperandType::Int8, IntOperandType::_Int8, &v);

Здесь ваши параметры имеют следующие типы:

const char[3], eOperandType, IntOperandType, int*

Заметили несоответствие из подписи?Вы, вероятно, хотите назвать это так:

int v = 0;
Converter::convertValue<int>(eOperandType::Int8, "20", IntOperandType::_Int8, v);

, где "20" неявно преобразуется в const std::string&, а v, который является lvalue типа int, может быть неявно связан сlvalue ссылка на int, int&.

0 голосов
/ 26 октября 2018

Это может быть строка, предшествующая типу операнда e, когда вы вызываете функцию, списки параметров не совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...