如何将算术运算符添加到std :: array?

时间:2019-05-12 00:36:53

标签: c++ c++11 c++14 c++17 stdarray

我希望继承所有方法,包括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上添加算术运算符的任何更好的主意。谢谢!

2 个答案:

答案 0 :(得分:2)

好吧,等等,原因很复杂,但是不用担心,解决方案很简单。继续阅读。

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

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

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

一个建议:避免使用using namespace std Why is "using namespace std" considered bad practice?

Two phase lookup - explanation needed

答案 1 :(得分:0)

如果您只需要为std :: array添加算术运算,我认为您无需为此创建类。您只需定义非成员模板运算符即可使用,而无需直接访问std :: array实现。

template <typename T, size_t N>
auto operator+(const array<T, N>& ob1, const array<T, N>& ob2)->array<T, N> {
    array<T, N> res;
    for (int i = 0; i < N; ++i)
        res[i] = ob1[i] + ob2[i];
    return res; 
}

对于其他算术运算,依此类推。