Создание 2-D ассоциативного массива с помощью оператора шаблона

0

Пытаясь определить 2-D ассоциативный массив, я написал оператор шаблона внутри моего класса, чтобы приблизить его к исходному массиву. Это моя операторская функция.

template <class T, class U, class V>
T& TwoAssocDArray<T,U,V>::operator [](U input1)[](V input2) {
    for(int i=0; i<size(); i++)
        if(stack[i].key1 == input1 && stack[i].key2 == input2) 
                return stack[i].d;
    DataPack pack;
    pack.key1 = input1;
    pack.key2 = input2;
    stack.push_back(pack);
    return stack[size].d;
}

Интерфейс класса,

#ifndef _DATASTRUCTURE_H_
#define _DATASTRUCTURE_H_

#include <vector>

using namespace std;

template <class T, class U, class V>
class TwoDAssocArray {

private:
    typedef struct _DataPack {
        T d;
        U key1;
        V key2;
    } DataPack;
    vector<DataPack> stack;

public:
    int size();
    bool isIn(U input1, V input2);
    bool add(T data, U input1, V input2);
    T get(U input1, V input2);
    T& operator [](U input1)[](V input2);
};

#endif

Затем я проверил его в main().

int main(int argc, char *argv[]) {

    TwoDAssocArray<int, char*, char*> assocArr;

    assocArr["in1"]["in2"] = 2246001;
    cout << assocArr["in1"]["in2"] << endl;

    return 0;
}

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

Если бы кто-нибудь помог мне, я был бы признателен.

  • 0
    Вы должны пересмотреть свой дизайн: что-то вроде arr[x][y] требует объект arr который поддерживает доступ [] и возвращает другой объект, подходящий для второго доступа [] .
Теги:
arrays
templates

1 ответ

0

T& operator [](U input1)[](V input2);

Вы не можете так привязывать операторов. Возможно, вы видели, что operator[] может принимать только один аргумент, так что вам не повезло для T& operator [](U input1, V input2);

Из названия этого сообщения это похоже на то, что вы действительно хотите уметь:

assocArr["in1"]["in2"] = 2246001;

Есть способ получить эту функциональность, и это реализовать ее в одном измерении:

template <class T, class U >
class MyArray {

private:
    struct DataPack {
        T d;
        U key1;
    };

    std::vector<DataPack> stack;

public:
    T& operator[]( U key );
};

int main( void )
{
  MyArray< int, char > one_dimension;
  one_dimension[ 'a' ]; // returns an int reference

  // Now the trick
  MyArray< MyArray< int, char >, char > two_dimensions;
  two_dimensions['a']; // returns a MyArray< int, char > reference
  two_dimensions['a']['b']; // returns an int reference
}

Также обратите внимание на то, как я объявляю структуру, это C++ мой друг. Чтобы добавить, не используйте char *, используйте const char *. На самом деле не используйте const char *, используйте std::string.

const char * может быть проверен на равенство, но вы не будете сравнивать содержимое внутри c-строк, вы будете сравнивать адрес указателей.

Ещё вопросы

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