我正在尝试编写一组函数,将字符串转换为它们相应的数字值“ 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);
答案 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操作数类型之前的字符串,参数列表不匹配。