无序图:自有值类型问题
我有一个用户定义的类,它应该是unsorted_map的值类型。我的问题是,插入不工作(用gcc 4.7编译时已经是一个静态错误)。无序图:自有值类型问题
我的类:以创建地图并插入
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> >’
是对的DocID类型可哈希?这对于unordered_map的键类型是必需的,这是compailer所抱怨的。另一方面,DocID听起来像支持一个命令,为什么不使用一个映射,它被实现为二叉搜索树?
此外,您的副本构造函数和复制赋值运算符已损坏。他们复制指针,然后原始对象和副本都认为他们拥有资源。如果其中一个被破坏,则该资源被删除,导致在另一个对象被破坏时产生双重空闲。
typedef unsigned int DocID。所以它应该是可散列的?我修复了析构函数,错误仍然:( – mateuszk87 2013-04-04 09:14:24
有很多遗漏的信息,阻止我们给你一个正确的答案。例如,什么是doc_bk_hamming
?您分配和unordered_map
并将其地址分配给指针my_map
。但是,您将(my_key, my_value)
对插入我们看不到的doc_bk_hamming
所指的地图中。
'root = copy_this.root;'您正在复制指针的值。你知道吗? – 2013-04-04 09:02:11
您的副本构造函数和复制指派操作符已损坏。操作之后,两个对象将具有相同的指针,并且两个析构函数都会尝试删除它。 – 2013-04-04 09:03:28
什么是DocID? – ForEveR 2013-04-04 09:05:09