为什么我不能在 std::shared_ptr<unsigned char[]> 上使用 [] 运算符?

Why cannot I use [] operator on std::shared_ptr<unsigned char[]>?

我正在为 Arduino(更准确地说,Teensy)编写一个应用程序。编译以下代码(最后粘贴的行)时:

void executeActions(std::shared_ptr<unsigned char[]> actionData, const unsigned short actionBytes)
{
  unsigned short modifier = 0;
  Keyboard.set_modifier(modifier);

  int i = 0;
  while (i < actionBytes)
  {
    unsigned char action = actionData[i];

我收到以下错误:

no match for 'operator[]' (operand types are 'std::shared_ptr<unsigned char []>' and 'int')

供参考,提到的actionData是按以下方式初始化的(然后传递了几次):

this->actionData = std::make_shared<unsigned char[]>(new unsigned char[this->actionBytes]);

我做错了什么?

在 C++17 及更高版本中,std::shared_ptr 有一个 operator[](仅当 T 是数组类型时)。这个运算符在C++11..14中不存在,这显然是你正在编译的,或者粗略地看一下,Arduino不完全支持C++17。

还有:

std::make_shared<unsigned char[]>(new unsigned char[this->actionBytes])

应该是:

std::make_shared<unsigned char[]>(actionBytes)

但这仅适用于 C++20 及更高版本。

在这种情况下,我建议使用 std::vector<unsigned char> 而不是 unsigned char[](你不应该手动使用 new),例如:

actionData = std::make_shared<std::vector<unsigned char>>(actionBytes);
void executeActions(std::shared_ptr<std::vector<unsigned char>> actionData)
{
  unsigned short modifier = 0;
  Keyboard.set_modifier(modifier);

  for(size_t i = 0; i < actionData->size(); ++i)
  {
    unsigned char action = (*actionData)[i];
    ...
  }

  /* simpler:
  for (auto action : *actionData)
  {
    ...
  }
  */

  ...
}