Я хочу перегрузить векторный оператор [], чтобы легко создать временный подвектор.
Я думал, что это будет что-то вроде кода, показанного ниже. Однако, когда я пытаюсь скомпилировать, я получаю ошибку:
error: "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());};
}
Хотя некоторые операторы, такие как 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);
}
Согласно стандарту C++
13.5.5 Подписки
1 оператор [] должен быть нестатической функцией-членом только с одним параметром. Он реализует подписи
синтаксис postfix-expression [выражение]
или
postfix-expression [braced-init-list]
Таким образом, выражение x.operator[](y)
x [y] интерпретируется как x.operator[](y)
для объекта класса x типа T, если существует T::operator[](T1)
и если оператор выбран как наилучшая функция соответствия механизмом разрешения перегрузки (13.3.3).
std::vector::operator[]
(вы не можете)