Compilation Error: Undefined Archtiecture

Compilation Error: Undefined Archtiecture

我正在尝试编写一个简单的程序来了解 C++ 中的二叉树遍历。但是,当我尝试使用 make 编译我的程序时,出现以下错误:

Undefined symbols for architecture x86_64:
  "Node::postOrderTraversalNode(Node*)", referenced from:
      BinaryTree::postOrderTraversal(BinaryTree*) in BinaryTree.o
      postOrderTraversalNode(Node*) in Node.o
ld: symbol(s) not found for architecture x86_64

我查看了其他 StackExchange 帖子并将其缩小到与我如何设置 makefile 有关的内容,但我似乎仍然找不到错误。任何帮助将不胜感激。

生成文件:

BinaryTree_Program: Main.o BinaryTree.o Node.o
    clang++ BinaryTree.o Node.o Main.o -o BinaryTree_Program

Main.o: Main.cpp
    clang++ -c Main.cpp -o Main.o

BinaryTree.o: BinaryTree.h BinaryTree.cpp
    clang++ -c BinaryTree.cpp -o BinaryTree.o

Node.o: Node.h Node.cpp
    clang++ -c Node.cpp -o Node.o

clean:
    rm BinaryTree_Program Main.o BinaryTree.o Node.o

Main.cpp

#include "BinaryTree.h"
#include "Node.h"

int main() {
  Node* root = new Node(10);
  Node* nd1 = new Node(5);
  Node* nd2 = new Node(3);
  Node* nd3 = new Node(2);
  Node* nd4 = new Node(15);
  Node* nd5 = new Node(12);
  Node* nd6 = new Node(20);

  root->left = nd1;
  root->right = nd4;

  nd1->left = nd2;
  nd1->right = nd3;

  nd4->left = nd5;
  nd4->right = nd6;

  //       10
  //      /  \
  //    5    15
  //   / \   / \
  //  3  2  12 20

  BinaryTree* tree = new BinaryTree(root);
  BinaryTree::inOrderTraversal(tree);
}

BinaryTree.cpp

#include "BinaryTree.h"
#include "Node.h"

// The in, pre, and post is based on where we visit the root

BinaryTree::BinaryTree(Node* nd) {
  root = nd;
}

// The in, pre, and post is based on where we visit the root
void BinaryTree::inOrderTraversal(BinaryTree* t) {
  if (t != NULL){
    Node::inOrderTraversalNode(t->root);
  }
}

void BinaryTree::preOrderTraversal(BinaryTree* t) {
  if (t != NULL) {
    Node::preOrderTraversalNode(t->root);
  }
}

void BinaryTree::postOrderTraversal(BinaryTree* t) {
  if (t != NULL) {
    Node::postOrderTraversalNode(t->root);
  }
}

Node.cpp

#include "Node.h"

Node::Node(int d) {
  data = d;
  left = NULL;
  right = NULL;
}

void Node::visitNode(Node* nd) {
  std::cout << nd -> data << " " << std::endl;
}

void Node::inOrderTraversalNode(Node* nd) {
  if (nd != NULL) {
    Node::inOrderTraversalNode(nd -> left);
    Node::visitNode(nd);
    Node::inOrderTraversalNode(nd -> right);
  }
}

void Node::preOrderTraversalNode(Node* nd) {
  if (nd != NULL) {
    Node::visitNode(nd);
    Node::preOrderTraversalNode(nd -> left);
    Node::preOrderTraversalNode(nd -> right);
  }
}

void postOrderTraversalNode(Node* nd) {
  if (nd != NULL){
    Node::postOrderTraversalNode(nd -> left);
    Node::postOrderTraversalNode(nd -> right);
    Node::visitNode(nd);
  }
}

Node.h

#ifndef NODE_H
#define NODE_H
#include <iostream>

class Node {
public:
  // member data
  int data;
  Node* left;
  Node* right;

  // constructor
  Node(int d);

  // member functions
  static void inOrderTraversalNode(Node* nd);
  static void preOrderTraversalNode(Node* nd);
  static void postOrderTraversalNode(Node* nd);
  //static void levelOrderTralversalNode(Node* n);
  static void visitNode(Node*);
};

#endif

BinaryTree.h

#ifndef BINARYTREE_H
#define BINARYTREE_H

#include <iostream>
#include "Node.h"
using namespace std;

class BinaryTree {
public:
  // member data
  Node* root;

  // constructor
  BinaryTree(Node* n);

  // member functions
  static void inOrderTraversal(BinaryTree* t);
  static void preOrderTraversal(BinaryTree* t);
  static void postOrderTraversal(BinaryTree* t);
  //void levelOrderTraveral(BinaryTree* t);
};

#endif

Node.h 声明了以下函数:

static void inOrderTraversalNode(Node* nd);
static void preOrderTraversalNode(Node* nd);
static void postOrderTraversalNode(Node* nd);
static void visitNode(Node*);

Node.cpp 包含 Node::inOrderTraversalNode 和 Node::preOrderTraversalNode 的声明以及这个自由函数:

void postOrderTraversalNode(Node* nd) {
  if (nd != NULL){
    Node::postOrderTraversalNode(nd -> left);
    Node::postOrderTraversalNode(nd -> right);
    Node::visitNode(nd);
  }
}

但不包含 Node::postOrderTraversalNode

的声明

很明显,自由函数 postOrderTraversalNode 是一个成员函数,因此它应该像其他函数一样声明为 class 成员:

void Node::postOrderTraversalNode(Node* nd) {
  if (nd != NULL){
    Node::postOrderTraversalNode(nd -> left);
    Node::postOrderTraversalNode(nd -> right);
    Node::visitNode(nd);
  }
}