【问题标题】:tic tac toe - no match for operator* errortic tac toe - 不匹配 operator* 错误
【发布时间】:2025-12-28 16:00:16
【问题描述】:

我正在尝试用 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);

谁能给我解释一下是什么导致了错误以及如何解决它?

【问题讨论】:

  • 在编程方面,我看不出这个问题与井字游戏有什么关系。
  • 两件事。 (a) 谁让你在这里做int size = sizeof(old_arr)/sizeof(old_arr[0]);? (b) 你有没有替我朝他们脸上开枪?
  • 不要使用那种愚蠢的 sizeof 技巧。这很糟糕,因为它让您认为它有效,然后却无效。使用此处的 size 函数:gist.github.com/3959946,或完全停止使用数组(更好的选择包括 std::vectorstd::array,具体取决于使用情况)。不要接受[] 参数。这些不是数组,而是指针。
  • @R.MartinhoFernandes:请您的size 函数模板实例化应采用const。而且,是的,我知道。

标签: c++ arrays templates pointers operators


【解决方案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&lt;&gt;,它知道它的大小。

【讨论】:

  • 这可能会修复该错误,但不会好(尺寸计算错误)。
  • 我看不出这有什么奇怪的。它在a[b] 被解析为它的真正含义并且类型明确之后显示了这一行。 GCC 这样做是为了它的所有诊断。
  • @R.MartinhoFernandes:是的,但是a)错误是帖子的内容,而不是游戏逻辑,b)我仍在添加信息。
  • You could use the following template to get around 不,您仍然按值接受数组,这会调用衰减。
  • @KevinBallard:然而,在您通过 reference 接受数组之前,数组名称仍会衰减为指针。试试看。
【解决方案2】:

改变这个:

*new_arr[i] = old_arr[i];

为此:

new_arr[i] = old_arr[i];

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

【讨论】:

  • 记住数组是指针,如果你想使用 * 你应该把 *(new_arr+i)= old_arr[i]
  • 一个指针存储一个内存方向和一个存储“数组”的变量,它存储数组的第一个元素的方向,所以当我说数组是指针时,我的意思是“old_arr”是指向数组的指针
【解决方案3】:

这会比您想要的更安全:

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

它强制目标的大小与源的大小相同。如果你最终想要覆盖它,你真的应该重新考虑你的设计。

【讨论】:

    最近更新 更多