2014-11-20 15 views
5

Mam problemy z przeciążeniem operatora indeksu dolnego klasą szablonu w C++. Mam niestandardową implementację klasy mapy i muszę mieć dostęp do elementów za pomocą klucza.Problemy z przeciążaniem operatora [] z szablonem klasy

template <typename K, typename DT> 
DT& myMap<K, DT>::operator[](K key) 
{ 
    for (int i = 0; i<size; i++) 
{ 
    if (elements[i].key == key){ 
     return elements[i].data; 
    } 
} 
} 

To jak próbuję przeciążać operatora w tej chwili. Kompilator nie akceptuje klawisza K, aby wyszukać dane. K jest typem danych dla klucza. Jest przechowywany w oddzielnej klasie, którą klasa myMap zawiera w tablicy.

Więc jeśli w głównym staram się zrobić:

myMap<string, int> * test = new myMap < string, int > ; 
test["car"] = 50; 

Mówi:

Error expression must have an integral or unscoped enum type 

Nie jestem pewien, co jest problem.

+4

Dlaczego nie wystarczy użyć 'MyMap testu; 'a następnie' test ["car"] 'będzie działać zgodnie z oczekiwaniami. –

+1

Problem polega na tym, że niepotrzebnie używasz "nowego", co jest złym nawykiem, którego należy unikać w C++. To nie jest Java ani C#. –

Odpowiedz

5

test jest wskaźnikiem do MyMap, a nie jego przedmiotem, więc test["car"] wywołuje wbudowany operator dereferencji, a nie przeciążenie.

Potrzebujesz (*test)["car"] lub test->operator[]("car"), aby działało.

+0

Dziękuję za szybką odpowiedź. Tak, to rozwiązało. –

+0

Nie jest to najlepsza odpowiedź. Tak, to sprawia, że ​​kod działa, ale nie rozwiązuje "problemu"! Problem nie polega na tym, że kod się nie kompiluje, ale że OP niepotrzebnie używał przydziału wskaźnika i sterty! –

+0

@FabioFracas tak, to sprawia, że ​​moja odpowiedź jest bezużyteczna. Dzięki za upadek. – jrok

0

Twoim błędem jest użycie wskaźnika do MyMap zamiast samego obiektu. Zamiast

myMap<string, int> * test = new myMap < string, int > ; 
(*test)["car"] = 50 // works but is not idiomatic C++ 
// ... 
delete test; // don't forget! 

należy użyć

auto test = myMap<string, int>{}; 
// or: myMap<string, int> test = myMap<string, int>{}; 
test["car"] = 50 

Jeśli naprawdę trzeba użyć wskaźników, należy przynajmniej używać inteligentne kursory:

auto test_ptr = std::make_unique<myMap<string, int>>(); 
// or: std::unique_ptr<myMap<string, int>> test_ptr = std::make_unique<myMap<string, int>>(); 
(*test)["car"] = 50;