在main中访问类的模板友好函数。

时间:2011-10-20 03:26:18

标签: c++ templates function friend

我很难找到一个简单的解决方案。我正在使用以下类实现表达式树,我声明了类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;
};

在main中,我得到“错误:expTree未在此范围内声明。” 我也得到,“错误:期望构造函数,析构函数或类型转换之前—令牌“ 在这段代码的第二行.. 任何人有任何指针?

1 个答案:

答案 0 :(得分: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); 

我想评论一下命名模板参数和参数的风格。习惯上使用TUV等作为模板参数,而不是函数参数。因此,当您将声明写为:

时感觉很好
 template<class T> Tree<T> expTree(Tree<T> *&object);  

嗯,我刚换了名字。