在C ++中使用带有自定义值对象的unordered_map [英] Using unordered_map with custom value object in C++
问题描述
我试图创建一个unordered_map,其中的键是char类型,值是一个指向我自己的自定义类的指针。这可能吗?每当我尝试编译,我得到这个和其他错误:
$ g ++ -std = c ++ 0x -o spellchecker spellchecker.cpp -lstdc ++
spellchecker.cpp:17:27:错误:模板参数2无效
spellchecker.cpp:17:27:error:template argument 5无效
#include< iostream>
#include< string>
#include< unordered_map>
#include< vector>
using namespace std;
class Node {
public:
Node();
〜Node();
bool getletter;
bool iseofword;
char letter;
unordered_map< char,* Node>儿童; // line 17
};
我试过:
unordered_map< char,Node>儿童; // line 17(not pointer)
但我得到:
g ++ -std = c ++ 0x -o spellchecker spellchecker.cpp -lstdc ++
pre>
在/usr/include/c++/4.6/bits中包含的文件/stl_algobase.h:65:0,
来自/usr/include/c++/4.6/bits/char_traits.h:41,
来自/usr/include/c++/4.6/ios:41,
来自/usr/include/c++/4.6/ostream:40,
来自/usr/include/c++/4.6/iostream:40,
来自spellchecker.cpp:1:
/usr/include/c++/4.6/bits/stl_pair.h:在'std :: pair< const char,Node>'的实例化中:
/usr/include/c++/4.6/bits/stl_function.h: 486:12:从'std :: _ Select1st< std :: pair< const char,Node> >'
/usr/include/c++/4.6/bits/hashtable_policy.h:789:20:实例化自'std :: __ detail :: _ Hash_code_base< char,std :: pair< const char,Node& std :: _ Select1st< std :: pair< const char,Node> >,std :: equal_to< char>,std :: hash< char>,std :: __ detail :: _ Mod_range_hashing,std :: __ detail :: _ Default_ranged_hash,false>'
/usr/include/c++/4.6 /bits/hashtable.h:105:11:从'std :: _ Hashtable< char,std :: pair< const char,Node> std :: allocator< std :: pair< const char,Node> >,std :: _ Select1st< std :: pair< const char,Node> >中的std :: equal_to<焦炭>中的std ::散列<焦炭>中的std :: __细节:: _ Mod_range_hashing,性病:: __细节:: _ Default_ranged_hash,性病:: __细节:: _ Prime_rehash_policy,假的,假的,真>'
/usr/include/c++/4.6/bits/unordered_map.h:44:11:从'std :: __ unordered_map< char,Node,std :: hash< char>,std :: equal_to< char> ,std :: allocator< std :: pair< const char,Node> >,false>'
/usr/include/c++/4.6/bits/unordered_map.h:256:11:从'std :: unordered_map< char,Node>'实例化
spellchecker.cpp: 17:28:从这里实例化
/usr/include/c++/4.6/bits/stl_pair.h:93:11:错误:'std :: pair< _T1,_T2> :: second'有不完整的类型
spellchecker.cpp:8:7:error:'Node Node'的向前声明
spellchecker.cpp:在成员函数'int Trie :: addword(std :: string)'中:
spellchecker .cpp:45:39:错误:不能转换'std :: __ detail :: _ Map_base< char,std :: pair< const char,Node> ;, std :: _ Select1st< std :: pair& > true,std :: _ Hashtable< char,std :: pair< const char,Node>,std :: allocator< std :: pair& >,std :: _ Select1st< std :: pair< const char,Node> >中的std :: equal_to<焦炭>中的std ::散列<焦炭>中的std :: __细节:: _ Mod_range_hashing,性病:: __细节:: _ Default_ranged_hash,性病:: __细节:: _ Prime_rehash_policy,假的,假的,真> > :: mapped_type {aka Node}'到赋值中的'Node *'
spellchecker.cpp:52:39:error:can not convert'std :: __ detail :: _ Map_base< char,std :: pair< const char,Node>,std :: _Select1st< std :: pair< const char,Node> > true,std :: _ Hashtable< char,std :: pair< const char,Node>,std :: allocator< std :: pair& >,std :: _ Select1st< std :: pair< const char,Node> >中的std :: equal_to<焦炭>中的std ::散列<焦炭>中的std :: __细节:: _ Mod_range_hashing,性病:: __细节:: _ Default_ranged_hash,性病:: __细节:: _ Prime_rehash_policy,假的,假的,真> > :: mapped_type {aka Node}'到赋值中的'Node *'
spellchecker.cpp:53:3:error:expected';'before'} token
spellchecker.cpp:In function 'int main()':
spellchecker.cpp:60:26:错误:从'Trie *'转换为非标量类型'Trie'请求
从/ usr / include / c ++ /4.6/bits/hashtable.h:35:0,
来自/usr/include/c++/4.6/unordered_map:45,
来自spellchecker.cpp:3:
/ usr / include /c++/4.6/bits/hashtable_policy.h:在成员函数'std :: __ detail :: _ Map_base< _Key,_Pair,std :: _Select1st< _Pair> ;, true,_Hashtable> :: mapped_type& std :: __ detail :: _ Map_base< _Key,_Pair,std :: _Select1st< _Pair>,true,_Hashtable> :: operator [](const _Key&)[with _Key = char,_Pair = std :: pair& Node> _Hashtable = std :: _ Hashtable< char,std :: pair< const char,Node> std :: allocator< std :: pair< const char,Node& >,std :: _ Select1st< std :: pair< const char,Node> >中的std :: equal_to<焦炭>中的std ::散列<焦炭>中的std :: __细节:: _ Mod_range_hashing,性病:: __细节:: _ Default_ranged_hash,性病:: __细节:: _ Prime_rehash_policy,假的,假的,真> ;, std :: __ detail :: _ Map_base< _Key,_Pair,std :: _ Select1st< _Pair> ;, true,_Hashtable> :: mapped_type = Node]':
spellchecker.cpp:45:39:从这里实例化
/usr/include/c++/4.6/bits/hashtable_policy.h:549:24:error:'struct std :: pair< const char,Node>'没有名为'second'的成员
/ usr / include /c++/4.6/bits/hashtable_policy.h:550:26:error:'struct std :: pair< const char,Node>'没有名为'second'的成员
在包含在/ usr / include /来自/usr/include/c++/4.6/bits/char_traits.h:41,
来自/usr/include/c++/4.6/的c ++ / 4.6 / bits / stl_algobase.h:65:0,
ios:41,
从/usr/include/c++/4.6/ostream:40,
从/usr/include/c++/4.6/iostream:40,
从spellchecker.cpp:1 :
/usr/include/c++/4.6/bits/stl_pair.h:在构造符'std :: pair< _T1,_T2> :: pair(std :: pair< _U1,_U2>&&& [with _U1 = char,_U2 = Node,_T1 = const char,_T2 = Node]':
/usr/include/c++/4.6/bits/hashtable_policy.h:94:12:从'std :: __detail :: _ Hash_node< _Value,false> :: _ Hash_node(_Args&& ...)[使用_Args = {std :: pair< char,Node>},_Value = std :: pair< const char,Node>]'
/usr/include/c++/4.6/ext/new_allocator .H:114:4:无效__gnu_cxx :: new_allocator<实例; _TP> ::结构(__ gnu_cxx :: new_allocator< _TP> ::指针,_args和放大器;&安培; ...)与_args = {性病::对< ; char,Node>},_Tp = std :: __ detail :: _ Hash_node< std :: pair< const char,Node> false> __gnu_cxx :: new_allocator< _Tp> :: pointer = std :: _ std :: pair< const char,Node>,false> *]'
/usr/include/c++/4.6/bits/hashtable.h:485:6:从'std :: _ Hashtable实例化_Key,_Value ,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code,__constant_iterators,__unique_keys> :: _节点*的std :: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code, __constant_iterators,__unique_keys> :: _ M_allocate_node(_args&安培;&安培; ...)与_args = {性病::对<焦炭,节点>},_key =字符,_Value =的std ::对<为const char,节点>中_Allocator = std :: allocator< std :: pair< const char,Node> >,_ExtractKey = std :: _ Select1st< std :: pair< const char,Node> >中_Equal =的std :: equal_to<焦炭>中_H1 =的std ::散列<焦炭>中_H2 =的std :: __细节:: _ Mod_range_hashing,_hash =的std :: __细节:: _ Default_ranged_hash,_RehashPolicy =的std :: __细节: :_Prime_rehash_policy,布尔__cache_hash_code =假,布尔__constant_iterators =假,布尔__unique_keys = TRUE,性病:: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code,__constant_iterators,__unique_keys> :: _节点= std :: __ detail :: _ Hash_node< std :: pair< const char,Node> false>]'
/usr/include/c++/4.6/bits/hashtable.h:928:62:的std :: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code,__constant_iterators,__unique_keys> ::迭代器的std :: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2 ,_hash,_RehashPolicy,__cache_hash_code,__constant_iterators,__unique_keys> :: _ M_insert_bucket(_Arg&安培;&放;,的std :: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code,__constant_iterators,__unique_keys计算值: :size_type类型,类型名称的std :: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code,__constant_iterators,__unique_keys> :: _ Hash_code_type)与_Arg =的std ::对<焦炭,节点> ,_Key = char,_Value = std :: pair< const char,Node> _Allocator = std :: allocator< std :: pair< const char,Node& >,_ExtractKey = std :: _ Select1st< std :: pair< const char,Node> >,_Equal = std :: equal_to< char> ;, _H1 = std :: hash< char> ;, _H2 = std :: __ detail :: _mod_range_hashing,_Hash = std :: __ detail:_ Default_ranged_hash,_RehashPolicy = std :: _ :_Prime_rehash_policy,布尔__cache_hash_code =假,布尔__constant_iterators =假,布尔__unique_keys = TRUE,性病:: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code,__constant_iterators,__unique_keys> ::迭代=的std :: __细节:: _ Hashtable_iterator<的std ::对<为const char,节点>中假的,假> ;,的std :: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code, __constant_iterators,__unique_keys> :: SIZE_TYPE =长unsigned int类型,类型名称的std :: _哈希表< _key,_Value,_Allocator,_ExtractKey,_Equal,_H1,_H2,_hash,_RehashPolicy,__cache_hash_code,__constant_iterators,__unique_keys> :: _ Hash_code_type =长期无符号整型] '
/usr/include/c++/4.6/bits/hashtable_policy.h:549:24:实例化自'std :: __ detail :: _ Map_base< _Key,_Pair,std :: _ Select1st< _Pair> ;, true,_Hashtable> ; :: mapped_type& std :: __ detail :: _ Map_base< _Key,_Pair,std :: _Select1st< _Pair>,true,_Hashtable> :: operator [](const _Key&)[with _Key = char,_Pair = std :: pair& Node> _Hashtable = std :: _ Hashtable< char,std :: pair< const char,Node> std :: allocator< std :: pair< const char,Node& >,std :: _ Select1st< std :: pair< const char,Node> >,std :: equal_to< char> ;, std :: hash< char>,std :: __ detail :: _mod_range_hashing,std :: __ detail :: _ Default_ranged_hash,std :: __ detail :: _ Prime_rehash_policy, std :: __ detail :: _ Map_base< _Key,_Pair,std :: _ Select1st< _Pair> ;, true,_Hashtable> :: mapped_type = Node]'
spellchecker.cpp:45:39:从这里实例化
/usr/include/c++/4.6/bits/stl_pair.h:137:40:错误:使用无效字段'std :: pair< _T1,_T2> :: second
解决方案您的指针表示法不正确。 *节点无效。 *在类型之后,T *不是* T。
unordered_map< char,Node *>儿童;
I'm trying to create an unordered_map where the key is of type char and the value is a pointer to my own custom class. Is this possible? Whenever I try compiling I get this among other errors:
$ g++ -std=c++0x -o spellchecker spellchecker.cpp -lstdc++
spellchecker.cpp:17:27: error: template argument 2 is invalid
spellchecker.cpp:17:27: error: template argument 5 is invalid
#include <iostream> #include <string> #include <unordered_map> #include <vector> using namespace std; class Node{ public: Node(); ~Node(); bool getletter; bool iseofword; char letter; unordered_map<char, *Node> children; // line 17 };
I've tried:
unordered_map<char, Node> children; // line 17 (not pointer)
but I get this:
g++ -std=c++0x -o spellchecker spellchecker.cpp -lstdc++ In file included from /usr/include/c++/4.6/bits/stl_algobase.h:65:0, from /usr/include/c++/4.6/bits/char_traits.h:41, from /usr/include/c++/4.6/ios:41, from /usr/include/c++/4.6/ostream:40, from /usr/include/c++/4.6/iostream:40, from spellchecker.cpp:1: /usr/include/c++/4.6/bits/stl_pair.h: In instantiation of ‘std::pair<const char, Node>’: /usr/include/c++/4.6/bits/stl_function.h:486:12: instantiated from ‘std::_Select1st<std::pair<const char, Node> >’ /usr/include/c++/4.6/bits/hashtable_policy.h:789:20: instantiated from ‘std::__detail::_Hash_code_base<char, std::pair<const char, Node>, std::_Select1st<std::pair<const char, Node> >, std::equal_to<char>, std::hash<char>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>’ /usr/include/c++/4.6/bits/hashtable.h:105:11: instantiated from ‘std::_Hashtable<char, std::pair<const char, Node>, std::allocator<std::pair<const char, Node> >, std::_Select1st<std::pair<const char, Node> >, std::equal_to<char>, std::hash<char>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>’ /usr/include/c++/4.6/bits/unordered_map.h:44:11: instantiated from ‘std::__unordered_map<char, Node, std::hash<char>, std::equal_to<char>, std::allocator<std::pair<const char, Node> >, false>’ /usr/include/c++/4.6/bits/unordered_map.h:256:11: instantiated from ‘std::unordered_map<char, Node>’ spellchecker.cpp:17:28: instantiated from here /usr/include/c++/4.6/bits/stl_pair.h:93:11: error: ‘std::pair<_T1, _T2>::second’ has incomplete type spellchecker.cpp:8:7: error: forward declaration of ‘class Node’ spellchecker.cpp: In member function ‘int Trie::addword(std::string)’: spellchecker.cpp:45:39: error: cannot convert ‘std::__detail::_Map_base<char, std::pair<const char, Node>, std::_Select1st<std::pair<const char, Node> >, true, std::_Hashtable<char, std::pair<const char, Node>, std::allocator<std::pair<const char, Node> >, std::_Select1st<std::pair<const char, Node> >, std::equal_to<char>, std::hash<char>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true> >::mapped_type {aka Node}’ to ‘Node*’ in assignment spellchecker.cpp:52:39: error: cannot convert ‘std::__detail::_Map_base<char, std::pair<const char, Node>, std::_Select1st<std::pair<const char, Node> >, true, std::_Hashtable<char, std::pair<const char, Node>, std::allocator<std::pair<const char, Node> >, std::_Select1st<std::pair<const char, Node> >, std::equal_to<char>, std::hash<char>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true> >::mapped_type {aka Node}’ to ‘Node*’ in assignment spellchecker.cpp:53:3: error: expected ‘;’ before ‘}’ token spellchecker.cpp: In function ‘int main()’: spellchecker.cpp:60:26: error: conversion from ‘Trie*’ to non-scalar type ‘Trie’ requested In file included from /usr/include/c++/4.6/bits/hashtable.h:35:0, from /usr/include/c++/4.6/unordered_map:45, from spellchecker.cpp:3: /usr/include/c++/4.6/bits/hashtable_policy.h: In member function ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = char, _Pair = std::pair<const char, Node>, _Hashtable = std::_Hashtable<char, std::pair<const char, Node>, std::allocator<std::pair<const char, Node> >, std::_Select1st<std::pair<const char, Node> >, std::equal_to<char>, std::hash<char>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = Node]’: spellchecker.cpp:45:39: instantiated from here /usr/include/c++/4.6/bits/hashtable_policy.h:549:24: error: ‘struct std::pair<const char, Node>’ has no member named ‘second’ /usr/include/c++/4.6/bits/hashtable_policy.h:550:26: error: ‘struct std::pair<const char, Node>’ has no member named ‘second’ In file included from /usr/include/c++/4.6/bits/stl_algobase.h:65:0, from /usr/include/c++/4.6/bits/char_traits.h:41, from /usr/include/c++/4.6/ios:41, from /usr/include/c++/4.6/ostream:40, from /usr/include/c++/4.6/iostream:40, from spellchecker.cpp:1: /usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(std::pair<_U1, _U2>&&) [with _U1 = char, _U2 = Node, _T1 = const char, _T2 = Node]’: /usr/include/c++/4.6/bits/hashtable_policy.h:94:12: instantiated from ‘std::__detail::_Hash_node<_Value, false>::_Hash_node(_Args&& ...) [with _Args = {std::pair<char, Node>}, _Value = std::pair<const char, Node>]’ /usr/include/c++/4.6/ext/new_allocator.h:114:4: instantiated from ‘void __gnu_cxx::new_allocator<_Tp>::construct(__gnu_cxx::new_allocator<_Tp>::pointer, _Args&& ...) [with _Args = {std::pair<char, Node>}, _Tp = std::__detail::_Hash_node<std::pair<const char, Node>, false>, __gnu_cxx::new_allocator<_Tp>::pointer = std::__detail::_Hash_node<std::pair<const char, Node>, false>*]’ /usr/include/c++/4.6/bits/hashtable.h:485:6: instantiated from ‘std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node* std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_allocate_node(_Args&& ...) [with _Args = {std::pair<char, Node>}, _Key = char, _Value = std::pair<const char, Node>, _Allocator = std::allocator<std::pair<const char, Node> >, _ExtractKey = std::_Select1st<std::pair<const char, Node> >, _Equal = std::equal_to<char>, _H1 = std::hash<char>, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node = std::__detail::_Hash_node<std::pair<const char, Node>, false>]’ /usr/include/c++/4.6/bits/hashtable.h:928:62: instantiated from ‘std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::iterator std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_insert_bucket(_Arg&&, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::size_type, typename std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type) [with _Arg = std::pair<char, Node>, _Key = char, _Value = std::pair<const char, Node>, _Allocator = std::allocator<std::pair<const char, Node> >, _ExtractKey = std::_Select1st<std::pair<const char, Node> >, _Equal = std::equal_to<char>, _H1 = std::hash<char>, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::iterator = std::__detail::_Hashtable_iterator<std::pair<const char, Node>, false, false>, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::size_type = long unsigned int, typename std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type = long unsigned int]’ /usr/include/c++/4.6/bits/hashtable_policy.h:549:24: instantiated from ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = char, _Pair = std::pair<const char, Node>, _Hashtable = std::_Hashtable<char, std::pair<const char, Node>, std::allocator<std::pair<const char, Node> >, std::_Select1st<std::pair<const char, Node> >, std::equal_to<char>, std::hash<char>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = Node]’ spellchecker.cpp:45:39: instantiated from here /usr/include/c++/4.6/bits/stl_pair.h:137:40: error: using invalid field ‘std::pair<_T1, _T2>::second
解决方案Your pointer notation is incorrect. *Node isn't valid. The * comes after the type, T* not *T.
unordered_map<char, Node*> children;
这篇关于在C ++中使用带有自定义值对象的unordered_map的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!