Пытаясь определить 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;
}
После сборки и запуска я обнаружил, что это не сработало, получилось десяток ошибок. Я предположил, что основной причиной является синтаксис шаблона, с которым я не знаком. Я считаю, что тонна ошибок всегда исходит из нескольких синтаксических ошибок.
Если бы кто-нибудь помог мне, я был бы признателен.
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-строк, вы будете сравнивать адрес указателей.
arr[x][y]
требует объектarr
который поддерживает доступ[]
и возвращает другой объект, подходящий для второго доступа[]
.