2016-01-06 85 views
0

我有一個類正處於代表字典的初始階段,並且有一些編譯問題。除了包含main的文件以外,這些是項目中唯一的文件。 Main不包含對Dictionary的引用。C++函數不是具有shared_ptr的類的成員,或者爲什麼我的變量未聲明?

Dictionary.h

#include <vector> 

typedef shared_ptr<Node> node_ptr; 
struct Node; 

class Dictionary 
{ 
public: 
    Dictionary(void); 
    ~Dictionary(void); 
    Dictionary(char* filename); 

private: 
    node_ptr root; 
    shared_ptr<Node> curNode; // 3 
    void buildTree(char* filename); 
    shared_ptr<Node> findChild(shared_ptr<Node> node, char val); // 1 
    node_ptr findChild(node_ptr node, char val); // 2 (not repeated in actual header) 
}; 

Dictionary.cpp

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <memory> 
#include "Dictionary.h" 

using namespace std; 

struct Node 
{ 
    Node::Node(char val) 
    { 
     value = val; 
    }; 
    vector<node_ptr> children; 
    char value; 
}; 

Dictionary::Dictionary(char* filename) 
{ 
    root = make_shared<Node>(0); 
    curNode = root; 
    buildTree(filename); 
} 

Dictionary::Dictionary(){} 
Dictionary::~Dictionary(void){} 

shared_ptr<Node> Dictionary::findChild(shared_ptr<Node> node, char val) // 1 
node_ptr Dictionary::findChild(node_ptr node, char val) // 2 
{ 

    for(int i = 0; i < node->children.size(); i++) 
    { 
     if(node->children[i]->value == val) 
      return node->children[i]; 
    } 

    return 0; 
} 

void Dictionary::buildTree(char* filename) 
{ 
    ifstream input; 
    node_ptr temp; 
    input.open(filename); 
    char* line = (char*)malloc(45); 

    for(int i = 0; i < 26; i++) //build the first 26 nodes 
     root->children.push_back(make_shared<Node>('a' + i)); 

    while(!input.eof()) 
    { 
     input >> line; 
     int lind = 1; 
     char curChar = line[0]; 
     curNode = findChild(root, curChar); //assume we got this one 

     while(1) 
     { 
      curChar = line[lind]; 
      if(curChar == 0) 
       break; 

      temp = findChild(curNode, line[lind]); 
      if(temp == 0) 
      { 
       temp = make_shared<Node>(line[lind]); 
       curNode->children.push_back(temp); 
       curNode = temp; 
      } 
      else 
       curNode = temp; 

      lind++; 
     } 
    } 

    free(line); 
} 

當我編譯這個我得到這些錯誤。 在粗體線1時的情況下,使用:「「findChild:不是成員‘詞典’‘ 在這種情況下粗體線2當使用:’語法錯誤:‘)’」

論的頂這我得到的錯誤聲明,我的變量沒有聲明如CurNode在Dictionary的構造函數。

這個問題似乎是以某種方式使用shared_ptr。

+0

已刪除。之前沒有發佈,並且由粗體按鈕添加。 – danielm2100

+0

你不需要在dictionary.h中使用'std :: shared_ptr'而不是'shared_ptr'嗎? – Roddy

+0

就是這樣。謝謝!我知道這將是明顯的。我如何將此標記爲答案? – danielm2100

回答

-1

將返回類型指定爲「** shared_ptr」會給您一個錯誤,因爲這不是有效的C++。看起來你想要「shared_ptr」,因爲你不是取消引用它(除非你用它作爲讀者的標記)。

另外,在頭文件中,您將指定「shared_ptr」,而不使用「namespace std;」在它之上,使編譯器認爲它實際上屬於「std」命名空間時是全局類型。

+0

我很困惑,如果第二部分是答案,爲什麼這是低調? –

+1

可能因爲你永遠不應該在頭文件中放置'使用;'。 – Roddy

+0

同意,但無論哪種方式都適用於他。 –

1
typedef shared_ptr<Node> node_ptr; 
struct Node; 

當您轉發聲明時,您需要在使用前聲明,而不是其他方式。如果您沒有收到編譯錯誤,則看起來您已在其他地方定義了Node,而shared_ptr<Node>的含義與您的typedef不同,因此爲錯誤。由於您不提供MCVE,因此很難說更多。

+0

轉換那些,但沒有改變錯誤。你正在看的是除了空的main()之外的所有代碼。 – danielm2100

+0

@ danielm2100將編譯器的確切錯誤附加到您的問題中(如果開頭有太多的錯誤) – Slava

相關問題