0

私はC ++の初心者なので、答えは明らかかもしれません。

2 つの関数があります。1 つは int を文字列に変換でき、もう 1 つは double を文字列に変換できます。ただし、これら 2 つを 1 つに統合する方がよりエレガントです。以下のコードで試してみましたが、エラーが発生します:「番号」はこのスコープで宣言されていません

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));
}
4

4 に答える 4

9

は括弧内でnumber宣言されているため、そのスペースにのみ存在します。if ... {さらに、C または C++ では、1 つの変数に 2 つの異なる型を持たせることはできません。

(C++11 コンパイラを使用している場合は、これを行う必要はまったくありませんstd::to_string。ほとんどの標準型に存在する which を使用するだけです)。

解決策は、ポインターを使用せず、テンプレート関数を使用することです。

template<typename T> string number_into_string(T number)
{
    ostringstream convert;
    convert << number; 
    string str = convert.str();
    return str;
}
于 2013-07-31T14:06:16.457 に答える
3

シンプルに、std::to_string関数を使用します。

于 2013-07-31T14:05:29.440 に答える
0

非常に厄介なことは別として、エラーの主な理由は変数のスコープです。すべての変数には可視性の範囲があり、その範囲を超えて表示されることはありません。

関数number_into_stringには、3 つのスコープがあります。

  1. 関数スコープ - これは関数全体ですnumber_into_string
  2. 最初のifブロック
  3. 2番目ifのブロック

関数スコープの変数は両方のifブロックで表示されますが、その逆は表示されません。

つまり、コードでは次のようになります。

convert << number;

現在のスコープで認識されていない (表示されていない) 変数を使用しています。

もう1つのことは、テンプレートを使用したり、その「変換コード」の2つのコピーをそれぞれのifブロックに入れたりしないと、C++でこの「ジェネリック値のこと」を実行できないことです。これにより、単一の「変換関数」を持つという点が無効になります。

また、 を使用してとを確実に区別することはできませんdoubleintsizeof

于 2013-07-31T14:11:44.487 に答える
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();
}

個人的には、(ひどく) 車輪を再発明する代わりに、標準ライブラリ関数を使用します。

于 2013-07-31T14:09:27.007 に答える