2017-03-07 302 views
1
#ifndef TRIEAPI 
#define TRIEAPI 

#include <vector> 
#include <string> 
#include <unordered_map> 

using namespace std; 

typedef struct NodeStruct 
{ 
    bool validNgram = false; 
    unordered_map<string, struct NodeStruct> children; 
    struct NodeStruct* parent; 
    string nodeWord; 

    NodeStruct(struct NodeStruct* par, string w) : parent(par), nodeWord(w) {} //constructor (yeah, structs have them too) 
    NodeStruct() {} 
}Node; 


void addNgramTrie(Node* root, string ngram); 
void findNgramsTrie(Node* root, string query); 
void splitText(string query, vector<string> &words); 
void deleteNgramTrie(Node* root, string ngram); 
void recursiveParentDeletion(Node* node, Node *root); 


#endif // TRIEAPI 

当我尝试编译程序我得到关于所述pair.h该头文件中的错误(以g ++编译5.4 C++ 11):C++:pair.h编译器错误 - 对具有不完全的类型

trie.h:14:46: required from here 
/usr/include/c++/5/bits/stl_pair.h:102:11: error: ‘std::pair<_T1, _T2>::second’ has incomplete type 
     _T2 second;    /// @c second is a copy of the second object 
     ^
In file included from trie.cpp:10:0: 
trie.h:11:16: note: forward declaration of ‘struct NodeStruct’ 
typedef struct NodeStruct 

我不明白我错在哪里。

+0

*“当我尝试编译程序时”* - 什么程序?我没有看到一个程序。 – IInspectable

+0

@iinspectable,你看到了什么?错误? :-P – WhiZTiM

+0

@JimS,那些'typedef'在C++中是没用的,只是给代码添加了混乱。您不需要“Eloborated类型说明符” – WhiZTiM

回答

0
typedef struct NodeStruct 
{ 
    bool validNgram = false; 
    unordered_map<string, struct NodeStruct> children; 

这不可能工作。想象一下,例如,如果unordered_map的大小取决于它包含的类型的大小。这当然是可能的。因此,要知道unordered_map<string, struct NodeStruct>的大小,首先需要知道struct NodeStruct的大小。但是由于struct NodeStruct包含这样一个unordered_map,您还需要知道地图的大小以了解结构的大小。

这怎么可能工作?也许在地图上使用unique_ptr<struct NodeStruct>

+0

但是,为什么当我使用地图而不是无序的地图时,我没有得到这个错误? – JimS

+0

@JimS语言级别的回答:你很幸运,它不需要使用'std :: map'。 –

+0

@JimS当你违反规则时,规则就会被破坏。遵守规则,系统也会遵守。 (我的观点表明它不能在一般情况下工作,并不是没有可能发生的具体情况,我的观点表明你不应该期待它的工作。) –

相关问题