在C++中乘以用户定义的数组
Multiplying user-defined arrays in C++
我有以下代码:
#include <iostream>
#include <array>
typedef std::array<int, 2> eval_t;
eval_t operator*(eval_t e1, eval_t e2) { return {e1[0] * e2[0], e1[1] * e2[1]}; }
int main()
{
eval_t a = {1, 2};
eval_t b = a * {2, 1};
std::cout << "b = (" << b[0] << ',' << b[1] << ')' << std::endl;
}
GCC 拒绝编译我的乘法:
$ g++ -std=c++11 test.cc
test.cc: In function ‘int main()’:
test.cc:10:17: error: expected primary-expression before ‘{’ token
eval_t b = a * {2, 1};
^
我天真地希望唯一可能的运算符*()将eval_t
作为左操作数,将是我定义的运算符,并且右操作数将被理解为eval_t
。
相反,如果我写:
eval_t a = {1, 2};
eval_t v = {2, 1};
eval_t b = a * v;
它有效。
std::array
是一个聚合,它没有像其他容器那样接受std::initializer_list
作为参数的构造函数,因此程序无法从initializer_list
创建eval_t
。因此,编译器找不到运算符重载函数的匹配类型,因此失败。
因此,{1, 2}
无法按预期隐式转换为eval_t
。
根据标准,二进制运算符不允许使用纯大括号初始值设定项,因此编译器将拒绝它。但在返回声明中是允许的。 此答案中解释了更多详细信息:运算符的初始值设定项列表和 RHS
如果按如下方式更改语句,它将起作用
eval_t b = a * eval_t{{2, 1}};
只是一个语法错误。将行更正为这些。
return{ { e1[0] * e2[0], e1[1] * e2[1] } };
和
eval_t b = a * eval_t{ { 2, 1 } };
测试:
#include <iostream>
#include <array>
typedef std::array<int, 2> eval_t;
eval_t operator*(eval_t e1, eval_t e2)
{
return{ { e1[0] * e2[0], e1[1] * e2[1] } };
}
int main()
{
eval_t a = { 1, 2 };
eval_t b = a * eval_t{ { 2, 1 } };
std::cout << "b = (" << b[0] << ',' << b[1] << ')' << std::endl;
// b = (2,2)
}
你也可以考虑不要定义你自己的重载operator*
,以利用标准库:
std::array<int, 2> a = {1, 2};
std::array<int, 2> b = {2, 1};
std::array<int, 2> c;
std::transform(a.begin(), a.end(), b.begin(), c.begin(), std::multiplies<int>());
现场演示
相关文章:
- C++编程从外部文本文件定义数组大小
- 如何在子类中重新定义数组大小?
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 在类中定义数组的方法和字段
- (C++)我的自定义数组无法初始化(编译错误)
- 重写自定义数组类的运算符/开始/结束
- 如何在 C++ 中定义数组数组
- 您可以在类初始化器列表中定义数组大小吗?
- 通过Overloading Operator []访问自定义数组包装器中的元素
- 为自定义数组实现迭代器
- 递归定义数组中的数据对齐和排序
- 如何从类中返回自定义数组项目并操纵其属性?C
- 如何使用类 .h 文件中的静态常量来定义数组的长度
- 使用类定义数组创建C++类
- C++自定义数组容器动态大小
- C++中使用什么类型来定义数组大小
- 在源文件中定义数组,然后在其他源文件中使用它
- C 编程从外部输入文件定义数组大小