2011-10-20 29 views
0

我很难找到一个简单的解决方案。我正在使用以下类实现表达式树,我声明了Tree类的一个友元函数。当我尝试以main开始时,我的问题就出现了。访问主类中的模板好友功能。

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没有在这个范围内声明。” 我也得到,“错误:期望的构造函数,析构函数或类型转换之前?代码” 在此代码的第二行。 任何人都有任何指针?

回答

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); 

我想对你命名的模板参数和参数的风格发表评论。通常使用TU,V等作为模板参数,而不是函数参数。

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

嗯,我只是换了名字:所以当你写的声明作为感觉很好。

+0

是的,我了解命名。尽管我有一位奇怪的教授。哈哈。这个函数实际上是无效返回的。所以我已经更新该行: 模板<类对象>无效expTree(树 * &T); ,并相应地改变了其他声明,现在我得到的是我不知道是什么意思的错误消息:( 。 _函数'main': :未定义的引用void exTree ,std :: allocator >>(树,std :: allocator >> *&)' collect2:ld返回1退出状态 _ – stef0526

+0

另请注意,内联函数只能通过ADL访问,我不知道如果有上10尽管如此。 –

+0

关于您未定义的引用错误 - 您尚未在编译器/链接程序可以找到它的任何位置定义expTree函数。 –