我有一个类,它处于表示字典的开始阶段,并且编译时遇到了一些问题。除了包含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。
答案 0 :(得分:1)
typedef shared_ptr<Node> node_ptr;
struct Node;
当您转发声明时,您需要在使用前声明,而不是相反。如果您没有收到编译错误,看起来您在其他地方定义了Node
,shared_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;命名空间。