gpt4 book ai didi

c++ - 无法识别模板函数

转载 作者:太空狗 更新时间:2023-10-29 21:33:01 26 4
gpt4 key购买 nike

我正在尝试编写一组将字符串转换为相应数值“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);

最佳答案

如果我冒昧地猜测 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 类型的左值,可以隐式绑定(bind)到 intint& 的左值引用。

关于c++ - 无法识别模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53013764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com