Ссылка на структуру, объявленную в классе шаблона - PullRequest
1 голос
/ 08 апреля 2011

Хорошо, я был на C ++ уже около 2 дней.Только что сделал javascript до ...

Я создаю очередь шаблонов, используя связанный список.Моему компилятору не нравится, когда я пытаюсь создать новую структуру Node из withink queue.cpp

//queue.h:
template <class Object>
class Queue
{
 public:
  Queue();                              // Default
  Queue(const Queue& original);         // Copy

  ~Queue();                             // Destructor

  const Queue& operator=(const Queue& rightHandSide);  //overloaded op

  bool isEmpty() const;

  bool enqueue(const Object& d);
  bool dequeue(Object& d);

 private:
  // Node definition
  struct Node
  {
    Object data;
    Node * next;
  };
  // Queue data members
  Node * front, * back;
};

Итак, в моем конструкторе копирования мне нужно создать новый Node.

//queue.cpp
template <class Object>
Queue<Object>::Queue(const Queue& original)
{
  if (original.isEmpty()) {
    front = back = NULL;
  } else {
    front = back = new Queue::Node;                 //this is line 26
    front->data = original.front->data;
    Queue::Node * ptr = original.front->next;
    while (ptr != NULL) {
      back->next = new Queue<Object>::Node;
      back = back->next;
      back->data = ptr->data;
      ptr = ptr->next;
    }
  }
}

queue.cpp: In copy constructor âQueue<Object>::Queue(const Queue<Object>&)â:
queue.cpp:26: error: expected type-specifier
queue.cpp:26: error: expected `;'

Любая помощь, плз?Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 08 апреля 2011

Внутри функций-членов Queue вы можете напрямую обратиться к Node.

front = back = new Node;                 //this is line 26

и

Node * ptr = original.front->next;

То, что у вас внутри цикла, также будет работать, где вы явно указываете параметры шаблона. Тем не менее, обратите внимание, что, поскольку Node является закрытым, если вы не создадите экземпляры шаблона friend s друг с другом, вы должны указать параметры шаблона для текущего создания экземпляра, поэтому Queue<Object>::Node подойдет, а Queue<int>::Node - нет, кроме самого Queue<int>.

1 голос
/ 08 апреля 2011

Что использовал ваш компилятор?Ваш код не должен иметь никаких проблем.Потому что когда имя Queue используется внутри класса, эквивалентно Queue<Object>.

Это в стандарте C ++,

Как и обычные (не шаблонные) классы, шаблоны классов имеютимя введенного класса (пункт 9).Нагнетаемого имя класса может использоваться с или без шаблона-аргумента-списка.Когда он используется без шаблона-аргумента-списка, он эквивалентен впрыскиваемого-класса имя-за которым следуют шаблонов параметров шаблона класса, вложенных в <>.Когда он используется с шаблоном-аргумента-списка, он относится к определенному шаблону класса специализации, которая может быть текущей специализации или иной специализации.

1008 *
0 голосов
/ 08 апреля 2011

Вот немного другое предложение:

// Node is defined within same "class { }", so it needs no "::" qualification
front = back = new Node;

В любом случае, ваш код как данный компилируется нормально (http://ideone.com/UrLN0),, поэтому мне интересно, есть ли что-то еще кроме того, что здесь.

Идентификатор Queue без параметров шаблона относится к текущей реализации внутри самого шаблона.

0 голосов
/ 08 апреля 2011

После запуска конструктора копирования <Object> будет добавлено неявно вместе с Queue при необходимости.Для совместимости со всеми платформами вы должны заявить следующее:

front = back = new typename Queue::Node;  //this is line 26
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...