Ошибка: для индекса требуется массив или указатель C++

Вот пример на котором у меня происходит подобное:

#include <iostream>
using namespace std;

template<class key, class value> //пара с двумя параметрами - ключ и значение
struct pairs 
{
    key Key;
    value Value;
};

template<class key, class value>
struct test
{
    pairs<key, value>* arr; //указатель для массива пар.
    test(const size_t& size) //выделяю памяти для массива пар
    {
        arr = new pairs<key, value>[size]; 
    }
    value& operator[](const key& key) //возвращаю ЗНАЧЕНИЕ
    {
        return arr->Value[key]; //<=== ошибка всплывает тут
    }
};

int main()
{
    test<int, int> Example(100);
    Example[0] = 0;
    cout << Example[0];
}

С чем связана данная ошибка и как можно ее исправить в моем случае?


Ответы (1 шт):

Автор решения: AR Hovsepyan

Выполните анализ того, что хотите делать:

  1. Вряд ли struct pairs еще где понадобится(поскольку есть std::pair), кроме как структуре test, поэтому лучше пусть pairs будет вложенным классом, чтобы "под ногами не валялся".
  2. Конструктор test принимает размер и создает массив такого размера, где хранятся пары. Однако эти пары не инициализированы, а значит нарушается инвариант(свойство объектов иметь определенное состояние). Конструктор должен их как то инициализировать или это должен делать конструктор этих объектов.
  3. Для того, чтобы operator[] принимал ключ и возвращал соответствующее значение(создание ассоциативности), нужно найти в массиве элемент с таким ключом и возвращать его значение(как подсказал αλεχολυτ, не получится, индексом для массива может быть только целочисленный тип). А если такого нет? Что делать тогда, решать вам. Я думаю, что нужно тогда инициализировать первый же элемент, имеющий значения по умолчанию и инициализировать его данным ключом. А если в массиве все элементы уже инициализированы, тогда или пусть, например, оператор ничего не делает. Естественно, что реализовав ассоциативный массив посредством простого массива, создаст проблемы такого рода и в быстродействии, но для малых задач покатит...
→ Ссылка