gpt4 book ai didi

c++ - 如何向 std::array 添加算术运算符?

转载 作者:太空狗 更新时间:2023-10-29 21:32:08 25 4
gpt4 key购买 nike

我希望继承所有方法包括std::array的构造函数。我试试

template<class T, size_t N>
class Vec : public array<T, N>
{
public:
using array<T, N>::array;

Vec operator+(Vec const& rhs) const
{
Vec res;
transform(begin(), end(), rhs.begin(), res.begin(), plus);
return res;
}

};

但是有一些编译错误。

  1. “开始”:未找到匹配的重载函数
  2. 我做不到Vec<int, 2> v{1, 2};像标准数组一样,甚至构造函数也是继承的。

我可能误解了什么。如何解决这些错误。在 std::array 上添加算术运算符的任何更好的想法。谢谢!

最佳答案

好的,等等,原因很复杂,但不要害怕,解决方案很简单。继续阅读。

array是一个模板,所以类的成员 array<T, N>在模板实例化之前是未知的(记住模板可以专门化)。因为begin似乎不依赖于任何模板参数,其名称在 array<T, N> 实例化之前的第一阶段查找中解析。 ,即在 array<T, N> 的成员之前是已知的。这就是为什么你得到 begin未找到或类似错误。

简单的解决方案是使用 this->begin .这条路begin将在第二阶段查找时解决(在实例化 std::array<T, N> 之后),因为现在很明显 begin可以是继承模板类的成员。

此外,plus应该是 plus<>{}plus{}在 C++17 中。

还有一个建议:尽量避免 using namespace std Why is "using namespace std" considered bad practice?

Two phase lookup - explanation needed

关于c++ - 如何向 std::array 添加算术运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56095325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com