我想用C ++创建一个八叉树数据结构。我有一个头文件,如下所示:
class Octree
{
public:
typedef struct node
{
int value;
node *child[8];
}node;
Octree();
~Octree();
int convert(int sorszam);
void clear(struct node*);
node* search(int dec,int oct);
};
我想在.cpp文件中编写搜索功能,但我总是收到错误消息。这是.cpp代码:
node* Octree::search(int dec, int oct) {
//doing something here
return nullptr;
}
错误信息显示:
声明与“Octree :: node * Octree :: search(int dec,int oct)”不兼容(在“c:\ Users \ xxx \ Documents \ Visual Studio 2015 \ Projects \ xxx \ xxx”的第19行声明\ Octree.h“)
我不知道发生了什么,因为两个函数的类型是相同的。我做错了什么?
答案 0 :(得分:2)
我不知道发生了什么,因为两个函数的类型是相同的。
类型不相同。在Octree
的定义中,您已定义了嵌套类node
。因此,在Octree
的定义中,类型名称node
引用Octree::node
。但是,在Octree
(您已定义成员函数)的定义之外,node
未引用Octree::node
。它指的是::node
,可能已在其他地方宣布过。
我做错了什么?
您(意外)重新声明成员函数的返回类型与声明返回的类型不同。只需使用完全限定名称即可引用正确的类型:
Octree::node* Octree::search(int dec, int oct)
答案 1 :(得分:2)
节点的typedef
范围限定在类中。当你使用
node* Octree::search(int dec, int oct)
在类体之外,编译器不知道什么节点是什么,因为我们在类的范围之外。您需要使用类名称<{1}}来限定node
Octree::node* Octree::search(int dec, int oct)
这允许编译器使用类中的node
。
在Octree
中,没有理由在typedef
上使用node
。与C不同,您在使用struct
时不必使用struct
关键字。你可能有
class Octree
{
public:
struct node
{
int value;
node *child[8];
};
//...
};
然后您可以像使用node
一样使用typedef
。
答案 2 :(得分:2)
错误是因为您还没有真正声明名为node
的类型。您已声明了名为Octree::node
的类型。由于Octree::search
函数的定义不在类声明之内,因此您需要使用类型的完全限定名称:
Octree::node* Octree::search(int dec, int oct) {
...