2012-11-05 19 views
0

我收到了一些我不知道的錯誤,並花了很多時間把我的頭髮拉出來。這裏是我的頭:只是幾個簡單的錯誤

#ifndef MYBSTREE_H 
#define MYBSTREE_H 

#include "abstractbstree.h" 
#include "MyBSTreeFunc.h" 
using namespace std; 

template<typename T> 
class TreeNode 
{ 
    public: 
    T m_data; 
    TreeNode* m_right; 
    TreeNode* m_left; 
}; 

template<typename T> 
class MyBSTree:public AbstractBSTree<T>  //LINE 18 
{ 
    private: 

    TreeNode<T>* m_root; 

    public: 


    void MyBSTree(); 

    int size() const; 

    bool isEmpty() const; 

    int height() const; 

    const T& findMax() const; 

    const T& findMin() const; 

    int contains(const T& x) const; 

    void clear(); 

    void insert(const T& x); 

    void remove(const T& x); 

    void printPreOrder() const; 

    void printPostOrder() const; 

    void print() const;  
}; 

#endif 

而且我實現文件:

線1-6

void MyBSTree() 
{ 
    m_root -> m_data = NULL; 
    m_root -> m_right = NULL; 
    m_root -> m_left = NULL; 
} 

13-21

template<typename T> 
bool MyBSTree<T>::isEmpty() const 
{ 
    if (m_root== NULL) 
    return true; 

    else 
    return false; 
} 

行28-35行

template < typename T > 
const T& MyBSTree<T>::findMax() const 
{ 
    TreeNode* p = m_root; 
    while(p -> m_right != NULL) 
    p = p -> m_right; 
    return p; 
} 

實現中第3行的錯誤說'm_root'未在此範圍內聲明。但第4行和第5行很酷。我猜是因爲m_data不是指針?我不知道。

接下來,第14行和第21行,還有不少其他人說,它期望在'<'標記之前有一個初始化器。我認爲他們都是相同的問題,所以我只在這裏放了幾個。

最後,它說在標題行18:「模板結構MyBSTree重新宣佈爲一種不同的符號。」然後它說我實現1號線的「無效MyBSTree先前聲明」我假設那些一起去

感謝所有幫助

+0

@JonathonReinhart我沒有意識到。謝謝你的鏈接。 – ViscousRandom

回答

1

你需要修復您的構造函數聲明:。

template < typename T > 
classMyBSTree 
{ 
    ... // some stuff 
public: 
    MyBSTree(); // no return type 
    ... // some stuff 
}; 

您ALSE需要解決您的構造函數:

template < typename T > 
MyBSTree::MyBSTree() // proper ctor definition 
{ 
    m_root -> m_data = T(); // use the initializer for that data type 
    m_root -> m_right = NULL; 
    m_root -> m_left = NULL; 
} 
0

1-6行:您已經定義命名的.cpp一個獨立的功能void MyBSTree()這是我不是班級的一部分。你的功能與你的班級相同也是不好的。它看起來像你想這是你的構造,在這種情況下,你需要這個(我將不包括模板的東西,因爲它不是問題):

// in .h 
class MyBSTree { 
    public: 
    MyBSTree(); // No void 
} 
// in .cpp 
// Uses MyBSTree namespace. 
MyBSTree::MyBSTree() { /* initialize your pointers etc */ } 

這似乎是你的主要問題,也可以解決其他問題。

0
  • 編譯器找不到m_roots的原因是因爲你的函數不是類的一部分。你可以通過將你的函數放入具有operator ::的類作用域來解決這個問題(例如:myBSTree::myBSTree(){};
  • 模板函數不能放在與它們的類不同的文件中,你需要在中定義所有的模板類和函數文件。將你的函數的實現移動到你的頭文件中。