C ++ overload []使用模板访问子向量

时间:2014-08-20 17:03:17

标签: c++ templates vector operator-overloading

我想重载[]向量运算符以轻松创建临时子向量。

我认为它会像下面显示的代码。但是,当我尝试编译时,我收到错误:

  

错误:“operator []”必须是成员函数

其中[]是向量的成员。

#include <vector>
#include <algorithm>

using namespace std

template <class T, int a, int b>
T& operator[](int a, int b)
{
    vector<class T> subvector;
    copy ( T.begin() + min(a, b), v1.begin() + max(a, b) + 1, back_inserter(subvector) );

    if (a > b) {reverse(subvector.begin(), subvector.end());};
}

2 个答案:

答案 0 :(得分:2)

虽然像operator+operator>>这样的运算符可以作为独立函数存在,但需要一些特定数量的参数,operator[]不能。它必须是类的成员函数。

您尝试实现的目标也无法完成,因为operator[]只能接受一个参数。

只需使用一个功能:

template<typename T>
std::vector<T> make_sub_vector(std::vector<T> const& v, int begin, int end) {
    assert(begin < end); // Either this, or you swap them 
                         // if this condition is not met.
                         // I'm asserting because I don't know 
                         // what to do when they're equal.
    return std::vector<T>(v.begin() + begin, v.begin() + end);
}

答案 1 :(得分:1)

根据C ++标准

13.5.5订阅

1 operator []应该是一个非静态成员函数,只有一个参数。它实现了下载

语法 postfix-expression [表达式]

postfix-expression [braced-init-list]

因此,对于类型的类对象x,下标表达式x [y]被解释为x.operator[](y) T如果T::operator[](T1)存在,并且重载决策机制(13.3.3)选择了运算符作为最佳匹配函数。