Доступ к шаблону дружественной функции класса в main. - PullRequest
0 голосов
/ 20 октября 2011

Мне трудно найти простое решение для этого.Я реализую дерево выражений, используя следующие классы, я объявляю дружественную функцию класса 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 я получаю «error: expTree не было объявлено в этой области».Во второй строке этого кода я также получаю «ошибка: ожидаемый конструктор, деструктор или преобразование типов перед символом â;». Кто-нибудь имеет указатели?

1 Ответ

0 голосов
/ 20 октября 2011
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, U, V и т. Д. Для параметров шаблона, а не для аргумента функции.Так что приятно, когда вы пишете декларацию как:

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

Ну, я просто поменял имена.

...