1

重複の可能性:
配列への参照パラメーターについて何が役立ちますか?
C ++で配列を使用するにはどうすればよいですか?

参照によって配列を渡そうとしています。問題は、これらの配列を渡すときにエラーが発生することです。

エラーC2664:'InitializeArrays':パラメータ1を'int [64]'から'int(&)[]'に変換できません

コードは次のとおりです。

void InitializeS(int (&s)[], int (&BeforeDecimal1)[]);

int main()
{
   int BeforeDecimal[128],s[128];

   InitializeS(s,BeforeDecimal);

   return 0;
}

void InitializeS(int (&s)[], int (&BeforeDecimal1)[])
{
    for(int i=0;i<128;i++)
    {
        s[i]=0;
        BeforeDecimal1[i]=0;
    }
}

私は何が間違っているのですか?

4

3 に答える 3

4

C ++では、Cの場合とは異なり、互換性のある型の概念はなく、型T[]はT[N]とは無関係です。参照にサイズを設定する必要があり、サイズは渡す配列のサイズと同じである必要があります。

C ++は、関数パラメーター型としての境界のない配列への参照も禁止しています(おそらくこの理由で)。

于 2012-12-21T10:32:30.800 に答える
3

なぜあなたはうまくいかないのですか

「配列」関数の引数の構文void foo(int array[])は、配列とは何の関係もないという点で誤解を招く恐れがあります。これは、の構文上の「砂糖」です(読んでください:私たちが立ち往生している恐ろしくレガシーな混乱void foo(int* array)

そのため、void foo(int (&array)[])あなたが思っていることをしません。と同等ではありませんvoid foo(int*& array)。実際、構文は単に存在しません。


参照による配列の受け渡し

実際の配列には次元があり、これらの次元は静的型の一部です(そして、「型」として表示されるすべての場所で、それを不完全な型として使用しているか、他の何かの単なる構文糖衣です)。タイプの寸法:int[]

void foo(int (&array)[5])

またはテンプレートを使用します。

template <size_t N>
void foo(int (&array)[N])

それができない場合はどうなりますか?

コンパイル時にディメンションがわからない場合は、SOLであるため、std::vector代わりに使用する必要があります。

于 2012-12-21T10:41:52.760 に答える
0

FredOverflowが示唆しているように、この機能を実装するにはテンプレートを使用する必要があります。

これを実装する方法は次のとおりです。

template<int S1, int S2> void InitializeS(int(&)[S1], int(&)[S2]);

int main()
{
   int BeforeDecimal[100],s[50];

   InitializeS(s,BeforeDecimal);

   return 0;
}

template<int S1, int S2> void InitializeS(int (&s)[S1], int (&BeforeDecimal1)[S2])
{
    for(int i=0;i<128;i++)
    {
        s[i]=0;
        BeforeDecimal1[i]=0;
    }
}

これは、コンパイル時に配列のサイズがわかっている場合にのみ機能することに注意してください。

于 2012-12-21T10:43:12.500 に答える