-1

C++ で三目並べゲームを作成しようとしていますが、実行するたびに次のようなエラー メッセージが表示されます。

TicTacToe.cpp: In instantiation of ‘void copy_array(T*, T*) [with T = std::basic_string<char>]’:
TicTacToe.cpp:115:25:   required from here
TicTacToe.cpp:93:3: error: no match for ‘operator*’ in ‘**(new_arr + ((sizetype)(((long unsigned int)i) * 8ul)))’

この関数を指します:

86    template<class T>
87    void copy_array(T old_arr[], T *new_arr)
88    {
89      int size = sizeof(old_arr)/sizeof(old_arr[0]);
90      for(int i = 0; i < size; i++)
91      {
92          *new_arr[i] = old_arr[i];
93      }
94    }

このコード片:

114    string copy[9];
115    copy_array(board, copy);

エラーの原因と解決方法を教えてください。

4

3 に答える 3

1

このエラー メッセージは非常に奇妙です。コードの変換されたバージョンを出力しているように見えますが、次の行を参照していると確信しています。

*new_arr[i] = old_arr[i];

を削除*すれば問題ありません。

もちろん、期待どおりに機能しませんが。あなたの議論T old_arr[]は のように振る舞いますT *old_arr。特に、sizeof()配列のフルサイズを提供するために依存している はそうではありません。

これを回避するには、次のテンプレートを使用できます。

template<class T, int N>
void copy_array(T (&old_arr)[N], T *new_arr) {
    for (int i = 0; i < N; i++) {
        new_arr[i] = old_arr[i];
    }
}

または、C++11 を使用できる場合は、std::array<>そのサイズを認識している に切り替えることができます。

于 2013-01-27T03:47:53.677 に答える
0

これにより、必要なものをより安全に変更できます。

template<typename T, size_t size>
void copy_array(T (&old_arr)[size], T (&new_arr)[size])
{
    std::copy(&old_arr[0], &old_arr[0] + size, &new_arr[0]);
}

宛先のサイズがソースのサイズと同じであることを強制します。それを上書きしたい場合は、実際に設計を再検討する必要があります。

于 2013-01-27T04:14:39.290 に答える
0

これを変える:

*new_arr[i] = old_arr[i];

このため:

new_arr[i] = old_arr[i];

括弧を使用すると、c++ はポインターを内部的に逆参照します。

于 2013-01-27T03:49:34.307 に答える