引用模板类中声明的结构

时间:2011-04-08 06:56:54

标签: c++ class templates struct

好的,现在在C ++工作了大约2天。刚刚完成javascript ...

我正在使用链接列表创建模板队列。当我尝试从withink queue.cpp

创建一个新的Node结构时,我的编译器不喜欢它
//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;
};

因此,在我的复制构造函数中,我需要创建一个新节点。

//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 `;'

任何帮助PLZ?提前谢谢。

4 个答案:

答案 0 :(得分:3)

Queue的内部成员函数,您可以直接引用Node

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

Node * ptr = original.front->next;

循环中的内容也可以使用,您可以在其中明确指定模板参数。但请注意,由于Node是私有的,除非您相互进行模板实例化friend,否则必须为当前实例化指定模板参数,因此Queue<Object>::Node很好,但是除Queue<int>::Node本身外,Queue<int>不是。{/ p>

答案 1 :(得分:1)

您的编译器使用了什么?您的代码应该没有任何问题。因为在类中使用名称Queue时,相当于Queue<Object>

它采用C ++标准,

  

与普通(非模板)类一样,   类模板有一个   注入类名(第9条)。该   inject-class-name可以使用   或没有template-argument-list。   什么时候使用没有   template-argument-list,它是   相当于inject-class-name   其次是模板参数   括在&lt;&gt;中的类模板。   与它一起使用时   template-argument-list,它指的是   指定的类模板   专业化,可能是   目前的专业化或其他   专业化。

答案 2 :(得分:0)

复制构造函数启动后,只要需要,<Object>将与Queue一起隐式添加。为了与所有平台兼容,您应该声明如下:

front = back = new typename Queue::Node;  //this is line 26

答案 3 :(得分:0)

这是一个略有不同的建议:

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

在任何情况下,你给出的代码编译得很好(http://ideone.com/UrLN0),所以我想知道在这里还有别的东西。

没有模板参数的标识符Queue是指模板本身内的当前实例化。