2011-10-20 8 views
0

私はこのための簡単な解決策を見つけるのに苦労しています。私は次のクラスを使って式ツリーを実装しています。クラスツリーのfriend関数を宣言します。私の問題は、私がメインで始めることを試みるときに来る。メインのクラスのテンプレートフレンド機能へのアクセス。

template<class object> class Tree; 
template<class object> Tree<object>::expTree(Tree<object> *&T); // ERROR 

template<class object> 
struct Node 
{ 
    object info; 
    Node *next; 
    Node<object>():info(0), next(NULL) {} 
    Node<object>(const object &element, Node *n = NULL): 
    info(element), next(n){} 
}; 
template<class object> 
class Stack 
{ 
public: 
    Stack(); 
    ~Stack(); 
    void makestackempty(); 
    bool stackEmpty() const; 
    void push(object &item); 
    void pop (object &item); 
    void printStack() const; 
private: 
    Node<object> *top; 
}; 
template<class object> 
struct TreeNode 
{ 
    object info; 
    TreeNode *right; 
    TreeNode *left; 
    TreeNode() 
    {} 
}; 

template<class object> 
class Tree 
{ 
private: 
    TreeNode<object> *root; 
public: 
    Tree(); 
    ~Tree(); 
    Tree(const Tree<object> &rhs); // copy 
    void operator=(const Tree<object> &rhs); 
    void copyconst(TreeNode<object> *orig, TreeNode<object> *&rhs); 
    void makeEmpty(TreeNode<object> *&tree); 
    bool isEmpty()const; 
    friend Tree<object> expTree(Tree<object> *&T){ 
    buildTree(T.root); 
    }; 
    void buildTree(TreeNode<object> *&tree); 
    void printTree(TreeNode<object> *&tree)const; 
}; 

主に「エラー:expTreeがこのスコープで宣言されていません」と表示されます。 私はまた、 "このコードの2行目の"エラー:予想されるコンストラクタ、デストラクタ、または型変換の前に " " 誰もがポインタを持っていますか?

答えて

0
template<class object> Tree<object>::expTree(Tree<object> *&T); // ERROR 
        //^^^^^^^^^^^^^^ cause of the error 

この関数テンプレートは、実際には無料の関数であり、クラスTreeの友人になります。ある

template<class object> expTree(Tree<object> *&T); 

は、宣言からTree<object>::を削除:だから次のように記述する必要があります。私はちょうど戻り値の型がないことに気付きました。戻り値の型にはTree<object>を意味しています(そしてTree<object>::はコードの誤字です)。もしそうなら、この書き込み:

template<class object> Tree<object> expTree(Tree<object> *&T); 

を私はテンプレートパラメータと引数に名前を付けるのあなたのスタイルにコメントしたいと思います。テンプレート引数には、関数引数ではなく、T,UVなどを使用するのが通例です。

template<class T> Tree<T> expTree(Tree<T> *&object); 

まあ、私は名前だけを入れ替え:だから、それはあなたのように宣言を記述するときに良い感じ。

+0

はい、わかりました。私は奇妙な教授を持っています。ハハ。この関数は実際にはvoidを返します。 テンプレート<クラスオブジェクト>のボイドexpTree(木 * &T); と私は今、私はそれが何を意味するのか知らないエラーメッセージを取得しています:( に応じて他の宣言を変更していますので、私はその行に更新しました。 _関数 'main 'で: :' void expTree 、std :: allocator >(ツリー、std :: allocator >> *) ' collect2:ldが1の終了ステータスを返しました。 _ – stef0526

+0

インラインフレンド機能は、ADLを使用してのみアクセスできます。前にしかし、その定義。 –

+0

定義されていない参照エラーについて - コンパイラ/リンカーが見つけることができるところでは、定義されたexpTree関数を使用できません。 –

関連する問題