无法识别模板功能

时间:2018-10-26 17:37:18

标签: c++ c++11 templates

我正在尝试编写一组函数,将字符串转换为它们相应的数字值“ 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 :(得分:2)

如果我可能会猜测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是类型int的左值,可以隐式绑定到对{{1}的左值引用},int

答案 1 :(得分:0)

调用该函数时,它可能是e操作数类型之前的字符串,参数列表不匹配。