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