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

C++ 如何将算术运算符添加到std::array?,c++,c++11,c++14,c++17,stdarray,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()

我希望继承所有的方法,包括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;
    }

};
模板
类Vec:公共数组
{
公众:
使用array::array;
向量运算符+(向量常量和右行)常量
{
Vec-res;
变换(begin()、end()、rhs.begin()、res.begin()、plus);
返回res;
}
};
但是有一些编译错误

  • “begin”:未找到匹配的重载函数
  • 我不能做
    vecv{1,2}像std数组一样,甚至构造函数也会被继承

  • 我可能误解了一些事情。如何解决这些错误。在std::array上添加算术运算符是否有更好的方法。谢谢

    好的,等等,原因很复杂,但不用担心,解决办法很简单。继续读下去

    array
    是一个模板,因此类
    array
    的成员在模板实例化之前是未知的(请记住,模板可以专门化)。由于
    begin
    似乎不依赖于任何模板参数,因此在
    array
    实例化之前,即在
    array
    的成员已知之前,在第一阶段查找时解析其名称。这就是为什么会出现
    begin
    未找到或类似错误的原因

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

    而且,在C++17中,
    plus
    应该是
    plus{}
    plus{}

    建议:尽量避免使用命名空间std


    如果只需要为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; 
    }
    
    模板
    自动运算符+(常量数组和ob1、常量数组和ob2)->数组{
    阵列分辨率;
    对于(int i=0;i

    其他算术运算也是如此。

    首先你有一个输入错误(res应该是rhs),第二个std::plus是一个类型,transform需要该类型的一个实例,第三个你需要在begin&end前面使用这个->(我想是关于两阶段查找的吧?)。第四,光明说了些什么。删除using array::array来修复brace init(我不知道为什么,但我认为这与array没有用户定义的ctor有关?)。。。如果这是一个很好的例子,那么任何想要复制/粘贴它的人都不需要提供所有其他的东西。小心,我认为它还不适用,但是我总是有一个容器而不是一个容器,以防有人试图扩展这个类。谢谢,我仍然想知道为什么不能使用聚合初始化
    Vec v{1,2}。我正在使用VS2017。我正在我的命名空间中使用命名空间std。不确定这是正常的还是不好的做法。@user1899020因为
    Vec
    不是使用名称空间std主题的聚合,模板仍然必须在标题中,对吗?因此,这并不局限于编译单元。你强迫每个使用这个的人把所有的std放在他们的名称空间中。或者您可以多次编写“std::”,这似乎是一个合理的负担。或者只需使用,无需创建新类