【问题标题】:Inheritance Issue - Expected class-name before '{' token继承问题 - '{' 标记之前的预期类名
【发布时间】:2013-10-19 18:24:13
【问题描述】:

所以我收到这个错误,这与我的 AVLTree 类继承我的 BTree 类的方式有关。据我所知,编译器的行为就好像它找不到 BTree.h (位于同一目录中),或者只是不喜欢我包含它的方式。

我一直在网上四处寻找,但我看到的有关此问题的大多数示例都涉及有人忘记包含某些内容,因此我不确定下一步该怎么做。

编辑:我还添加了 BTree.h 的代码示例

任何帮助将不胜感激。

g++ -g -w -Wall TreeTest.cpp BTree.h BinaryTree.h AVLTree.h -o testTrees 在 TreeTest.cpp:12:0: AVLTree.h:22:29 中包含的文件中: 错误:“{”标记 TreeTest.cpp 之前的预期类名:在函数中

这里是代码:

#ifndef AVLTree_H
#define AVLTree_H

#include <vector>
#include <iostream>
#include "BTree.h"

using std::vector;
using std::cout;
using std::string;

template <class T>
class AVLTree : public BTree{
    public:
        struct TreeNode{
            TreeNode * leftChild, 
                 * rightChild;
            T key;
            vector<T> data;
            int size;
            int height;
            bool deleted;
        };

        //Standard tree functions
        AVLTree();
        virtual ~AVLTree();
        virtual bool isEmpty();
        virtual int getSize();
        virtual int getHeight();
        virtual int insert(T key, T data); //returns number of insert calls
        virtual int remove(T key);         //returns number of remove calls
        virtual int contains(T key);       //removes number of contains calls, or 0 if doesn't exist
        virtual std::vector<T> getData(T key);

        //Special functions
        virtual void displayAll();
        virtual double getAverageDepth(); 
        virtual int getTotalIPL();  //Retrieves internal path length from root

    private: 
        int size;
        TreeNode * root;

        int * contains(T key, TreeNode * node, int calls);
        int insert(T key, T data, TreeNode *& node, int calls);
        int remove(T key, TreeNode *& node, int calls);
        int getDepth(TreeNode*curr, int total);
        int getIPL(TreeNode * start, int level);
        void rotateLeft(TreeNode *& node);
        void doubleLeft(TreeNode *& node);
        void rotateRight(TreeNode *& node);
        void doubleRight(TreeNode *& node);
        int max(int a, int b);
        int getHeight( TreeNode * t );
        void display(TreeNode * node, string indent, bool last);
        TreeNode * makeNode(T key, T data);
        TreeNode * getNode(T key, TreeNode * node);
        void destroySubTree(TreeNode * start);
};

这里是 BTree.h:

#ifndef bTree_H
#define bTree_H

#include <vector>

template <class T>
class BTree{
    public:
        struct TreeNode{
            TreeNode * leftChild, 
                 * rightChild;
            T key;
            std::vector<T> data;
            int size;
        };

        //Standard tree functions
        virtual ~BTree();
        virtual bool isEmpty() = 0;
        virtual int getSize() = 0;
        virtual int getHeight() = 0;
        virtual int insert(T key, T data) = 0; //returns number of insert calls
        virtual int remove(T key) = 0;         //returns number of remove calls
        virtual int contains(T key) = 0;        
        virtual std::vector<T> getData(T key) = 0;

        //Special functions
        virtual void displayAll() = 0;
        virtual double getAverageDepth() = 0; 
        virtual int getTotalIPL() = 0;  //Retrieves internal path length from root

    private: 
        int size;
        TreeNode * root;

};

template <class T> 
BTree<T>::~BTree<T>(){}

#endif

【问题讨论】:

  • 那么,它指向哪条线?
  • AVLTree.h:22:29:错误:“{”标记之前的预期类名。在第 22 行,我写了“class AVLTree : public BTree{”
  • 你能显示Btree.h的内容吗?
  • 我在上面添加了 BTree.h。
  • 我认为你需要从 Btree 继承,因为 Btree 是一个类模板

标签: c++ inheritance compiler-errors


【解决方案1】:

由于 BTree 是一个类模板,你不能直接从它继承,而必须指定它的实例化。也就是说,您必须提供模板参数,在您的情况下,它应该与实例化 AVLTree 的类型相同。

template <class T>
class AVLTree:public BTree<T>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多