C ++ перегрузка [] для доступа к подвектору с помощью шаблона

0

Я хочу перегрузить векторный оператор [], чтобы легко создать временный подвектор.

Я думал, что это будет что-то вроде кода, показанного ниже. Однако, когда я пытаюсь скомпилировать, я получаю ошибку:

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());};
}
  • 7
    Какая часть сообщения об ошибке непонятна? И не пытайтесь "заменить" std::vector::operator[] (вы не можете)
  • 0
    Что ты задумал ?
Показать ещё 2 комментария
Теги:
templates
vector
operator-overloading

2 ответа

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

Согласно стандарту 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).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню