我是c ++的初学者,所以答案可能很明显。
我有两个函数 - 一个能够将int转换为字符串,另一个能够将double转换为字符串。然而,将这两者合二为一,会更优雅。我已尝试使用下面的代码,但它会产生错误:'number'未在此范围内声明
string number_into_string (void* data, int psize)
{
if (psize == sizeof(int))
{
int* number; number =(int*)data;
}
if (psize == sizeof(double))
{
double* number; number = (double*)data;
}
ostringstream convert;
convert << number;
string str = convert.str();
return str;
}
int main()
{
double x =1000;
int y = 5;
string str_x = number_into_string(&x, sizeof(x));
string str_y = number_into_string(&y, sizeof(y));
}
答案 0 :(得分:9)
由于number
在if ... {
括号内声明,因此它只存在于该空间中。此外,您不能让一个变量在C或C ++中有两种不同的类型。
(如果你有一个C ++ 11编译器,你根本不需要这样做,只需使用大多数标准类型存在的std::to_string
。
解决方案是不使用指针,并使用模板函数:
template<typename T> string number_into_string(T number)
{
ostringstream convert;
convert << number;
string str = convert.str();
return str;
}
答案 1 :(得分:3)
简单,使用std::to_string
功能。
答案 2 :(得分:0)
一对花括号{}
创建嵌套范围,在该范围内创建的对象在外部范围内不可见。您可以将代码重新排列为以下内容:
string number_into_string (void* data, int psize)
{
ostringstream convert;
if (psize == sizeof(int))
{
convert << *((int*) data);
}
if (psize == sizeof(double))
{
convert << *((double*) data);
}
return convert.str();
}
就个人而言,我会使用标准库函数而不是(严重地)重新发明轮子。
答案 3 :(得分:0)
除了相当混乱之外,错误的主要原因是可变范围。每个变量都有其可见性范围,并且在该范围之外不可见。
在函数number_into_string
中,您有3个范围:
number_into_string
if
阻止if
阻止函数范围的变量在if
块中都可见,但不是相反。
这意味着,在您的代码中:
convert << number;
您正在使用当前范围内未知(可见)的变量。
另一件事是你只是 CAN&#39; T 这样做&#34;通用价值观&#34;在C ++中没有使用模板或者放置两个副本#34;转换代码&#34;进入每个if块,这使得单个&#34;转换功能无效#34;。
, CAN&#39; T 可以使用double
在int
和sizeof
之间进行可靠区分。