为什么我不能在 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)
{
...
}
*/
...
}
我正在为 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)
{
...
}
*/
...
}