首页 > 解决方案 > “类”在“<”标记错误之前没有命名类型和预期的初始化程序

问题描述

我正在实现一个模板类来制作二叉搜索树,但在编译时出现以下错误:

BinaryNodeTree.cpp:7:1: error: ‘BinaryNodeTree’ does not name a type
7 | BinaryNodeTree<ItemType>::BinaryNodeTree(){
  | ^~~~~~~~~~~~~~

BinaryNodeTree.cpp:18:1: error: ‘BinaryNode’ does not name a type
18 | BinaryNode<ItemType>* BinaryNodeTree<ItemType>::newTree(const BinaryNode<ItemType>* cTree) m 
const{
  | ^~~~~~~~~~
BinaryNodeTree.cpp:31:20: error: expected initializer before ‘&lt;’ token
 31 | void BinaryNodeTree<ItemType>::add(const ItemType& newData){
    |                    ​^

BinaryNodeTree.cpp:38:1: error: ‘BinaryNode’ does not name a type
 38 | BinaryNode<ItemType>* BinaryNodeTree<ItemType>::inOrderAdd(BinaryNode<ItemType>* subPtr, 
BinaryNode<ItemType>* newNodePtr){
  | ^~~~~~~~~~
BinaryNodeTree.cpp:59:24: error: expected initializer before ‘&lt;’ token
59 | ItemType BinaryNodeTree<ItemType>::getEntry(const int& value) const{

..等等..我所有的课程。这是我的 .h 文件,后面是我的 CPP 文件:

BinaryNodeTree.h:

#ifndef BINARY_NODE_TREE
#define BINARY_NODE_TREE

#include "BinaryNode.h"
#include "NotFoundException.h"
#include <iostream>

template<class ItemType>
class BinaryNodeTree //:public BinaryTreeInterface<ItemType>
{

private:
   BinaryNode<ItemType>* rootPtr;

protected:
   //------------------------------------------------------------
   // Protected Utility Methods Section:
   // Helper methods for public methods.
   //------------------------------------------------------------
   int getNumberOfNodesHelper(BinaryNode<ItemType>* subTreePtr) const;
   BinaryNode<ItemType>* removeValue(BinaryNode<ItemType>* subTreePtr, const int& target, bool& success);
   BinaryNode<ItemType>* removeNode(BinaryNode<ItemType>* nodeToDeletePtr);
   BinaryNode<ItemType>* removeLeftmostNode(BinaryNode<ItemType>* nodeToDeletePtr, ItemType& inorderSuccessor);
   bool isLeaf(BinaryNode<ItemType>* nodeToDeletePtr);
   void destroyTree(BinaryNode<ItemType>* subTreePtr);
   BinaryNode<ItemType>* findNode(BinaryNode<ItemType>* subTreePtr, int value) const;
   void inorderHelper(void visit(ItemType&), BinaryNode<ItemType>* subTreePtr) const;
   void preorderHelper(void visit(ItemType&), BinaryNode<ItemType>* subTreePtr) const;
   void postorderHelper(void visit(ItemType&), BinaryNode<ItemType>* subTreePtr) const;
   void levelOrderHelper(void visit(ItemType&), BinaryNode<ItemType>* subTreePtr, int level);
   BinaryNode<ItemType>* inOrderAdd(BinaryNode<ItemType>* subPtr, BinaryNode<ItemType>* newNodePtr);
   BinaryNode<ItemType>* newTree(const BinaryNode<ItemType>* cTree) const;
   //BinaryNode<ItemType>* getLeftmostNodeHelper(BinaryNode<ItemType>* nodeToGetPtr, ItemType& inorderSuccessor);

public:
   //------------------------------------------------------------
   // Constructor and Destructor Section.
   //------------------------------------------------------------
   BinaryNodeTree(); // creates an empty BST
   //BinaryNodeTree(const BinaryNodeTree<ItemType>& tree);
   ~BinaryNodeTree();

   //------------------------------------------------------------
   // Public Methods Section.
   //------------------------------------------------------------
   bool isEmpty() const;
   int getNumberOfNodes() const;
   void add(const ItemType& newEntry);
   bool remove(const int& value); //throw(NotFoundException);
   ItemType getEntry(const int& value) const; //throw(NotFoundException);
   bool contains(const int& value) const;
   ItemType getRootData() const;
   void setRootData(const ItemType& newData);
   void clear();
   //ItemType getLeftmostNode();
   int getHeight(BinaryNode<ItemType>* subTreePtr) const;
   //------------------------------------------------------------
   // Public Traversals Section.
   //------------------------------------------------------------
   void levelOrderTraverse(void visit(ItemType&));
   void preorderTraverse(void visit(ItemType&)) const;
   void inorderTraverse(void visit(ItemType&)) const;
   void postorderTraverse(void visit(ItemType&)) const;

   //------------------------------------------------------------
};
 // end BinaryNodeTree
#include "BinaryNodeTree.cpp"
#endif

BinaryNodeTree.cpp:

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


template<typename ItemType>
BinaryNodeTree<ItemType>::BinaryNodeTree(){
    rootPtr = nullptr;
    std::cout<<"constructor running"<<std::endl;
}

template<typename ItemType>
BinaryNodeTree<ItemType>::~BinaryNodeTree(){
    destroyTree(rootPtr);
}

template<typename ItemType>
BinaryNode<ItemType>* BinaryNodeTree<ItemType>::newTree(const BinaryNode<ItemType>* cTree) const{
    BinaryNode<ItemType>* newPtr = nullptr;
    if (cTree != nullptr){
        newPtr = new BinaryNode<ItemType>(cTree->getItem());
        newPtr->setLeftChildPtr(newTree(cTree->getLeftChildPtr()));
        newPtr->setRightChildPtr(newTree(cTree->getRightChildPtr()));
    }

    return newPtr;
}


template<typename ItemType>
void BinaryNodeTree<ItemType>::add(const ItemType& newData){
    BinaryNode<ItemType>* newNodePtr = new BinaryNode<ItemType>(newData);
    rootPtr = inOrderAdd(rootPtr,newNodePtr);
}


template<typename ItemType>
BinaryNode<ItemType>* BinaryNodeTree<ItemType>::inOrderAdd(BinaryNode<ItemType>* subPtr, BinaryNode<ItemType>* newNodePtr){
    if(subPtr == nullptr){
        return newNodePtr;
    }

    else if(newNodePtr->getItem() < subPtr->getItem()) {
        BinaryNode<ItemType>* tempPtr = inOrderAdd(subPtr ->getLeftChildPtr(), newNodePtr);
        subPtr->setLeftChildPtr(tempPtr);
    }

    else {
        BinaryNode<ItemType>* tempPtr = inOrderAdd(subPtr ->getRightChildPtr(), newNodePtr);
        subPtr->setRightChildPtr(tempPtr);
    }

    return subPtr;

}


template<typename ItemType>
ItemType BinaryNodeTree<ItemType>::getEntry(const int& value) const{
    BinaryNode<ItemType>* foundPtr = findNode(rootPtr, value);

    int foundItemNum = foundPtr->getItem();

    if (!contains(foundItemNum)){
        throw NotFoundException("No item found for given value.");
    }
    else
        return (foundPtr->getItem());
}



template<typename ItemType>
BinaryNode<ItemType>* BinaryNodeTree<ItemType>::findNode(BinaryNode<ItemType>* subPtr, int value) const{
    if (subPtr == nullptr)
        return nullptr;
    else if(subPtr->getItem() == value)
        return subPtr;
    else if(subPtr->getItem() > value)
        return findNode(subPtr->getLeftChildPtr(), value);
    else
        return findNode(subPtr->getRightChildPtr(), value);
}



template<typename ItemType>
int BinaryNodeTree<ItemType>::getNumberOfNodesHelper(BinaryNode<ItemType>* subTreePtr) const{
    if(subTreePtr == NULL)
       return 0;
   else
       return (1 + getNumberOfNodesHelper(subTreePtr->getLeftChildPtr()) + getNumberOfNodesHelper(subTreePtr->getRightChildPtr()));
}



template<typename ItemType>
bool BinaryNodeTree<ItemType>::isEmpty() const{
    if (rootPtr == nullptr)
        return true;
    else
        return false;
}


template<typename ItemType>
int BinaryNodeTree<ItemType>::getNumberOfNodes() const{
    return (getNumberOfNodesHelper(rootPtr));
}

template<typename ItemType>
ItemType BinaryNodeTree<ItemType>::getRootData() const {
    return rootPtr->getItem();
}

template<typename ItemType>
void BinaryNodeTree<ItemType>::setRootData(const ItemType& newData) {
    rootPtr->setItem(newData);
}


template<typename ItemType>
bool BinaryNodeTree<ItemType>::remove(const int& value) {
    bool success = false;
    rootPtr = removeValue(rootPtr, value, success);

    if (success == false){
        throw NotFoundException("Could not remove value");
    }
    else
        return success;
}

template<typename ItemType>
BinaryNode<ItemType>* BinaryNodeTree<ItemType>::removeValue(BinaryNode<ItemType>* subTreePtr, const int& target, bool& success){
    if (subTreePtr == nullptr){
        success = false;
        return nullptr;
    }

    else if (subTreePtr->getItem() == target){
        subTreePtr = removeNode(subTreePtr);
        success = true;
        return subTreePtr;
    }

    else if(subTreePtr->getItem() > target){
        BinaryNode<ItemType>* temp = removeValue(subTreePtr->getLeftChildPtr(), target, success);
        subTreePtr->setLeftChildPtr(temp);
        return subTreePtr;
    }
    else {
        BinaryNode<ItemType>* temp = removeValue(subTreePtr->getRightChildPtr(), target, success);
        subTreePtr->setRightChildPtr(temp);
        return subTreePtr;
    }
}


template<typename ItemType>
BinaryNode<ItemType>* BinaryNodeTree<ItemType>::removeNode(BinaryNode<ItemType>* nodeToDeletePtr){
    //No child pointers
    if (nodeToDeletePtr->isLeaf()){
        delete nodeToDeletePtr;
        nodeToDeletePtr = nullptr;
        return nodeToDeletePtr;
    }

    //One child point
    else if ((nodeToDeletePtr->getLeftChildPtr()==nullptr && nodeToDeletePtr->getRightChildPtr()!=nullptr) || (nodeToDeletePtr->getLeftChildPtr()!=nullptr && nodeToDeletePtr->getRightChildPtr()==nullptr)){
        BinaryNode<ItemType>* connectPtr;

        if(nodeToDeletePtr->getLeftChildPtr() == nullptr)
            connectPtr = nodeToDeletePtr->getRightChildPtr();
        else
            connectPtr = nodeToDeletePtr->getLeftChildPtr();

        delete nodeToDeletePtr;
        nodeToDeletePtr = nullptr;
        return connectPtr;

    }

    //Two children
    else {
        ItemType inorderSuccessor;
        BinaryNode<ItemType>* temp = removeLeftmostNode(nodeToDeletePtr->getRightChildPtr(), inorderSuccessor);
        nodeToDeletePtr->setRightChildPtr(temp);
        nodeToDeletePtr->setItem(inorderSuccessor);
    }

    return nodeToDeletePtr;
}


template<typename ItemType>
BinaryNode<ItemType>* BinaryNodeTree<ItemType>::removeLeftmostNode(BinaryNode<ItemType>* nodeToDeletePtr, ItemType& inorderSuccessor){
    if(nodeToDeletePtr->getLeftChildPtr() == nullptr) {
        inorderSuccessor = nodeToDeletePtr->getItem();
        return removeNode(nodeToDeletePtr);
    }

    else {
        nodeToDeletePtr->setLeftChildPtr(removeLeftmostNode(nodeToDeletePtr->getLeftChildPtr(), inorderSuccessor));
        return nodeToDeletePtr;
    }
}

template<typename ItemType>
bool BinaryNodeTree<ItemType>::isLeaf(BinaryNode<ItemType>* nodeToDeletePtr){
    if (((nodeToDeletePtr->getLeftChildPtr())==nullptr) && ((nodeToDeletePtr->getRightChildPtr())==nullptr))
        return true;
    else
        return false;
}

template<typename ItemType>
void BinaryNodeTree<ItemType>::clear() {

}

template<typename ItemType>
bool BinaryNodeTree<ItemType>::contains(const int& value) const{
    if (findNode(rootPtr, value))
        return true;
    else
        return false;
}

template<typename ItemType>
void BinaryNodeTree<ItemType>::preorderTraverse(void visit(ItemType&)) const{
    preorderHelper(visit, rootPtr);
}

template<typename ItemType>
void BinaryNodeTree<ItemType>::inorderTraverse(void visit(ItemType&)) const {
    inorderHelper(visit, rootPtr);
}


template<typename ItemType>
void BinaryNodeTree<ItemType>::postorderTraverse(void visit(ItemType&)) const {
    postorderHelper(visit, rootPtr);
}

template<typename ItemType>
void BinaryNodeTree<ItemType>::levelOrderTraverse(void visit(ItemType&)) {
    int hValue = getHeight(rootPtr);
    for (int i=1; i<hValue; i++){
      levelOrderHelper(visit, rootPtr, i);
    }
}



template<typename ItemType>
int BinaryNodeTree<ItemType>::getHeight(BinaryNode<ItemType>* subTreePtr) const{
  if (subTreePtr == nullptr){
    return(-1);
  }
  else {
        int lHeight = getHeight(subTreePtr->getLeftChildPtr());
        int rHeight = getHeight(subTreePtr->getRightChildPtr());

        if(rHeight > lHeight){
          return(rHeight+1);
        } else {
          return(lHeight+1);
        }
      }
}


template<typename ItemType>
void BinaryNodeTree<ItemType>::levelOrderHelper(void visit(ItemType&), BinaryNode<ItemType>* subTreePtr, int level) {
    if (subTreePtr != nullptr) {
        if (level == 1){
          ItemType anItem = subTreePtr->getItem();
          visit(anItem);
        }
        else {
          levelOrderHelper(visit, subTreePtr->getLeftChildPtr(), level-1);
          levelOrderHelper(visit, subTreePtr->getRightChildPtr(), level-1);
        }
    }
}


template<typename ItemType>
void BinaryNodeTree<ItemType>::inorderHelper(void visit(ItemType&), BinaryNode<ItemType>* subTreePtr) const{
    if(subTreePtr != nullptr){
    inorderHelper(visit, subTreePtr->getLeftChildPtr());

    ItemType anItem = subTreePtr->getItem();
    visit(anItem);

    inorderHelper(visit, subTreePtr->getRightChildPtr());
    }
}



template<typename ItemType>
void BinaryNodeTree<ItemType>::postorderHelper(void visit(ItemType&), BinaryNode<ItemType>* subTreePtr) const{
    if(subTreePtr != nullptr){
        postorderHelper(visit, subTreePtr->getLeftChildPtr());
        postorderHelper(visit, subTreePtr->getRightChildPtr());
        ItemType anItem = subTreePtr->getItem();
        visit(anItem);
    }
}

template<typename ItemType>
void BinaryNodeTree<ItemType>::preorderHelper(void visit(ItemType&), BinaryNode<ItemType>* subTreePtr) const{
    if(subTreePtr != nullptr){
        ItemType anItem = subTreePtr->getItem();
        visit(anItem);
        preorderHelper(visit, subTreePtr->getLeftChildPtr());
        preorderHelper(visit, subTreePtr->getRightChildPtr());
    }
}

template<typename ItemType>
void BinaryNodeTree<ItemType>::destroyTree(BinaryNode<ItemType>* subTreePtr){
    if(subTreePtr != NULL) {
       destroyTree(subTreePtr->getLeftChildPtr());
       destroyTree(subTreePtr->getRightChildPtr());
       delete subTreePtr;
    }
}

我不确定问题出在哪里,但我觉得我已经用尽了所有工具。我曾尝试在互联网上搜索问题,但我的努力是徒劳的。

标签: c++templatescompiler-errors

解决方案


在您的 BinaryNodeTree.cpp 中,#include 似乎已被注释掉。这应该可以解决至少部分问题。


推荐阅读