C ++函数不是具有shared_ptr的类的成员,或者为什么我的变量未声明?

时间:2016-01-06 21:24:59

标签: c++ shared-ptr

我有一个类,它处于表示字典的开始阶段,并且编译时遇到了一些问题。除了包含main的文件外,这些是项目中的唯一文件。 Main尚未包含对Dictionary的引用。

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:不是'Dictionary'的成员” 在使用粗体第2行的情况下:“语法错误:')'”

除此之外,我得到错误,声称我的变量未被声明,例如Dictionary的构造函数中的curNode。

问题似乎是以某种方式使用shared_ptr。

2 个答案:

答案 0 :(得分:1)

typedef shared_ptr<Node> node_ptr;
struct Node;

当您转发声明时,您需要在使用前声明,而不是相反。如果您没有收到编译错误,看起来您在其他地方定义了Nodeshared_ptr<Node>表示与您的typedef不同的内容,因此出现错误。由于您不提供MCVE,因此很难说更多。

答案 1 :(得分:-1)

将返回类型指定为&#34; ** shared_ptr&#34;给你一个错误,因为那是无效的C ++。看来你想要&#34; shared_ptr&#34;因为你没有取消引用它(除非你用它作为读者的标记)。

此外,在标题中,您指定&#34; shared_ptr&#34;没有&#34;使用命名空间std;&#34;在它之上,使编译器认为它是一个全局类型,当它实际上属于&#34; std&#34;命名空间。