2013-04-04 3 views
0

У меня есть пользовательский класс, который должен быть типом значения unsorted_map. Моя проблема в том, что вставка не работает (уже статическая ошибка при компиляции с gcc 4.7).Unordered Map: Own Value Type Issue

Мой класс:

class bk_tree { 

public: 
    bk_point *root; 
    DISTANCE_FUN metric; 
    int max_depth; 

    //assume words not empty 
    bk_tree() {metric=NULL; root=NULL; max_depth = 0;} 

    //rule of three 
    bk_tree(const bk_tree& copy_this) {metric=copy_this.metric; root=copy_this.root; max_depth = copy_this.max_depth;} 
    bk_tree& operator=(const bk_tree& copy_this) { metric=copy_this.metric; root=copy_this.root; max_depth = copy_this.max_depth; return *this; } 
    ~bk_tree() { delete root; } 

    bk_tree(unordered_set<string> *words, DISTANCE_FUN _metric); 
    bk_tree(DISTANCE_FUN _metric) { metric = _metric; root = NULL; max_depth = 0;   
}; 

код для того, чтобы создать карту и вставить:

#include<tr/unordered_map> 
using namespace std; 
using namespace std::tr1; 

unordered_map<DocID, sigmod::bk_tree> *my_map = new unordered_map<DocID, sigmod::bk_tree>; 
sigmod::bk_tree my_value = sigmod::bk_tree(&words, sigmod::hamming_distance_metric); 
doc_bk_hamming->insert(make_pair(my_key, my_value)); 

Компиляция (г ++ -O3 -std = C++ 11 -fopenmp -fPIC -Wall - г -I -I./include -c -o ref_impl/core.o). Ошибка:

ref_impl/core.cpp 
In file included from /usr/include/c++/4.7/bits/move.h:57:0, 
       from /usr/include/c++/4.7/bits/stl_pair.h:61, 
       from /usr/include/c++/4.7/bits/stl_algobase.h:65, 
       from /usr/include/c++/4.7/bits/char_traits.h:41, 
       from /usr/include/c++/4.7/string:42, 
       from ref_impl/../include/metric.h:5, 
       from ref_impl/core.cpp:29: 
/usr/include/c++/4.7/type_traits: In instantiation of ‘struct std::is_convertible<const std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false>&, std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false> >’: 
/usr/include/c++/4.7/type_traits:116:12: required from ‘struct std::__and_<std::is_convertible<const std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false>&, std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false> >, std::is_convertible<const bool&, bool> >’ 
/usr/include/c++/4.7/bits/stl_pair.h:113:38: required from here 
/usr/include/c++/4.7/type_traits:1263:12: error: the value of ‘std::__is_convertible_helper<const std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false>&, std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false>, false>::value’ is not usable in a constant expression 
/usr/include/c++/4.7/type_traits:1258:70: note: ‘std::__is_convertible_helper<const std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false>&, std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false>, false>::value’ used in its own initializer 
/usr/include/c++/4.7/type_traits:1263:12: note: in template argument for type ‘bool’ 
/usr/include/c++/4.7/type_traits: In instantiation of ‘struct std::__and_<std::is_convertible<const std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false>&, std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false> >, std::is_convertible<const bool&, bool> >’: 
/usr/include/c++/4.7/bits/stl_pair.h:113:38: required from here 
/usr/include/c++/4.7/type_traits:116:12: error: ‘value’ is not a member of ‘std::is_convertible<const std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false>&, std::tr1::__detail::_Hashtable_iterator<std::pair<const unsigned int, sigmod::bk_tree>, false, false> >’ 
+0

'root = copy_this.root;' Вы копируете значение указателя. Вы знаете об этом? –

+0

Ваш оператор копирования и оператор назначения копирования не работают. После операции оба объекта будут иметь один и тот же указатель, и оба деструктора попытаются удалить его. –

+0

Что такое DocID здесь? – ForEveR

ответ

1

ли тип hashable DocID? Это необходимо для ключевого типа unordered_map, и это то, о чем жалуется компилятор. С другой стороны, DocID звучит так, будто это будет поддерживать порядок, почему бы не использовать карту, которая реализована как двоичное дерево поиска?

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

+0

typedef unsigned int DocID. Значит, он должен быть хешируемым? Я исправил деструктор, и ошибка остается :( – mateuszk87

1

Существует много недостающей информации, которая мешает нам дать вам правильный ответ. Например, что такое doc_bk_hamming? Вы выделяете и unordered_map и присваиваете свой адрес указателю my_map. Однако вы вставляете пару (my_key, my_value) в карту, указанную doc_bk_hamming, которую мы не видим.