-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

改变这个:

*new_arr[i] = old_arr[i];

为了这:

new_arr[i] = old_arr[i];

当您使用方括号 c++ 在内部取消引用指针时。

于 2013-01-27T03:49:34.307 回答
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 回答