C++ 在'之前应进行构造函数、析构函数或类型转换*';代币

C++ 在'之前应进行构造函数、析构函数或类型转换*';代币,c++,C++,我真的不知道为什么会这样。我检查了,双重检查了,三重检查了大括号,分号,移动了构造函数,等等,但它仍然给我这个错误 相关代码如下 宾特里 #ifndef _BINTREE_H #define _BINTREE_H class BinTree { private: struct Node { float data; Node *n[2]; }; Node *r; Node* make( float ); public:

我真的不知道为什么会这样。我检查了,双重检查了,三重检查了大括号,分号,移动了构造函数,等等,但它仍然给我这个错误

相关代码如下

宾特里

#ifndef _BINTREE_H
#define _BINTREE_H

class BinTree
{
private:
    struct Node
    {
        float data;
        Node *n[2];
    };
    Node *r;

    Node* make( float );

public:
    BinTree();
    BinTree( float );
    ~BinTree();

    void add( float );
    void remove( float );

    bool has( float );
    Node* find( float );
};

#endif
和BinTree.cpp

#include "BinTree.h"

BinTree::BinTree()
{
    r = make( -1 );
}

Node* BinTree::make( float d )
{
    Node* t = new Node;
    t->data = d;
    t->n[0] = NULL;
    t->n[1] = NULL;
    return t;
}
因为在网上:

Node* BinTree::make( float d )
类型
节点
类BinTree
的成员

让它:

BinTree::Node* BinTree::make( float d )

如果您(a)复制完整的错误消息,(b)指出它在代码中出现的位置,以及(c)您使用的是哪个平台上的编译器,这将非常有用。应该提到的是,您的include-guard是不安全的。编译器保留以下划线开头而不是大写字母的名称。你应该做一些事情,比如将
\u BINTREE\u H
更改为
BINTREE\u H
天哪,我不知道你必须这么做。非常感谢你为我澄清这一点!这很棘手。有趣的是,您不必使用
BinTree::
——仅返回类型来限定参数。@j_random\u hacker:parameter declaration子句(以及在命名函数的标识符之后属于函数定义的所有内容)位于“类定义”(3.3.6/5“类范围”)的“声明的潜在范围”中。换句话说,类的所有成员都在函数名之后的成员函数定义的范围内。因此,返回类型没有得到类范围内的好处;来得太早了。C++ 0x有一种新的后继返回类型语法,可以让您在这方面工作,但它实际上是在模板中推导返回类型的。