2012-01-05 3 views
0

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

То, что я пытаюсь сделать что-то вроде этого:

 std::map<MyClass, unsigned int> mymap; 

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

Моя конечная цель должна быть в состоянии сделать что-то вроде этого:

std::vector<MyClass> MyClassPool; 
//fill the vector with MyClass objects... 
for(usigned int i=0 ; i<MyClassPool.size() ; i++) 
{ 
    mymap[ MyClassPool[i] ] = i; 
} 

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

я получаю следующие ошибки с вышесказанным:

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In member function `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Instance]': 

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_map.h:338: instantiated from `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = Instance, _Tp = float, _Compare = std::less<Instance>, _Alloc = std::allocator<std::pair<const Instance, float> >]' 

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y' 
+2

Что вы подразумеваете под "динамической привязкой к памяти"? Во всяком случае, ваш код выглядит правильно. Вы должны дать нам определение 'MyClass'. –

+0

разве вы не имели в виду 'vector' вместо' Vector'? Вы используете стандартный встроенный 'std :: vector', не так ли? –

+1

И что означает «это не работает»? Вы должны дать нам лучшую информацию. Скомпилирует ли он? Какое сообщение об ошибке вы получаете? –

ответ

1

Вы не обеспечивают operator< для MyClass. Требуется по std::map. У вас есть два варианта: предоставить компаратор в качестве третьего аргумента шаблона для map ИЛИ реализовать оператор в MyClass.

0

Это не имеет никакого отношения к «динамическому связыванию» (это не значит, что здесь все равно). Ваш класс должен иметь заказ, который должен быть помещен в карту. Ему нужен оператор <.

+0

. В одной попытке я заметил ошибку, указывающую на необходимость перегруженного оператора <. Не могли бы вы уточнить? – jathanasiou

+1

Просто напишите 'bool MyClass :: operator <(MyClass const & other) {/ * однако вы хотите сравнить свои классы * /}' как метод вашего класса MyClass. «Однако» часть зависит от вас, но это должно быть то, что подчиняется основным требованиям порядка 'operator <'. – ex0du5

2

Эта ошибка компиляции означает, что у вас нет operator < для Instance. map должен иметь возможность сортировать ключи и выполнять эту функцию. Если вы не хотите определять operator <, вам необходимо предоставить функцию сравнения в качестве третьего параметра шаблона для map, то есть std::map<Instance, float, compare_instances>.

... Подумайте об этом, вы уверены, что хотите получить Instance как ключ и float как данные, а не наоборот? То есть вы ищете на карте для Instance, чтобы получить float в обмен?

+0

Да, это правильно, классы экземпляров необходимо использовать в качестве ключей. – jathanasiou

Смежные вопросы