1

我有一个节点类,它在简单的标头声明中给了我以下编译器错误。我真的不明白为什么会导致它?!

1> Node.h(4): error : invalid redeclaration of type name "Node" (declared at line 4)
1>    class Node{
1>          ^

标题:

using namespace std;

class Node{     //THIS IS LINE 4 

    public:
        Node(int val);
        int val;
        Node* l_node;
        Node* r_node;

    private:

};

资源:

#include "Node.h"

Node::Node(int x) : l_node(nullptr), r_node(nullptr), val(x){

}

我需要提前声明还是什么???

4

2 回答 2

6

当你写一个头文件时,永远记得写一个包含守卫。

#ifndef NODE_H
#define NODE_H

class Node{      

public:
    explicit Node(int val); // add explicit to disable implicit conversion
    int val;
    Node* l_node;
    Node* r_node; 
};
#endif

另外,不要头文件中使用using指令;这是不好的做法。

在构造函数中,要注意成员初始化顺序。按声明顺序初始化成员,否则您可能会遇到初始化顺序问题:

Node::Node(int x) : val(x), l_node(nullptr), r_node(nullptr){

}
于 2013-11-09T00:42:48.273 回答
0

除了包含保护之外,您几乎应该总是为每个标头创建一个相应的 .cpp 文件,并将实现放在那里。如果您有多个使用相同标头的库,并且它们被第三个程序链接在一起,则会产生链接器错误。包括警卫不会保护您免受这种情况的影响。

于 2013-11-09T01:06:29.073 回答